Spring MVCで直接文字列を返した際のレスポンスヘッダのContent-Typeを指定する

コントローラのメソッドに@ResponseBodyアノテーションを付けるとメソッドの返り値がそのままレスポンスボディになります。返り値がStringの場合StringHttpMessageConverterがMessageConverterとして使用されますが、デフォルトの設定ではレスポンスヘッダのContent-Typeの値が「text/plain;charset=ISO-8859-1」になってしまいます。

「text/plain;charset=UTF-8」にするための簡易な方法として、@RequestMappingのパラメータにproducesを設定することができます。

	@RequestMapping(value="/put1", method=RequestMethod.PUT, produces="text/plain;charset=UTF-8")
	@ResponseBody
	public String put1(@RequestBody JsonObj obj) {
		return "obj.name = " + obj.getName() + ", obj.value = " + obj.getValue();
	}

個別に設定するのではなく、一括して設定するためにStringHttpMessageConverterのsupportedMediaTypesに値を渡しても良いです。この時writeAcceptCharsetの値がデフォルト値のままだと、レスポンスヘッダのAccept-Charsetに長々と値を設定してくれるのが余計なので、これもあわせて設定しています。

	<mvc:annotation-driven>
		<mvc:message-converters register-defaults="true">
			<bean class="org.springframework.http.converter.StringHttpMessageConverter">
				<property name="supportedMediaTypes" value="text/plain;charset=UTF-8" />
				<property name="writeAcceptCharset" value="false" />
			</bean>
		</mvc:message-converters>
	</mvc:annotation-driven>

まあ、返り値はオブジェクトなどにしてJSONを返す事の方が多そうですけどね。