tyn-iMarketの技術メモ

2012-07-27

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を返す事の方が多そうですけどね。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/tyn_iMarket/20120727/1343393610
Connection: close