JSON文字列を返すSpring MVC Controllerがあり、mimetypeをapplication/jsonに設定したいと思います。どうやってやるの?
@RequestMapping(method=RequestMethod.GET, value="foo/bar")
@ResponseBody
public String fooBar(){
return myService.getJson();
}
ビジネスオブジェクトはすでにJSON文字列として利用可能であるため、MappingJacksonJsonView
を使用することは私にとって解決策ではありません。 @ResponseBody
は完璧ですが、どのようにmimetypeを設定できますか?
JSON文字列ではなくドメインオブジェクトを返すようにサービスをリファクタリングし、Springにシリアル化を処理させることを検討します(作成時にMappingJacksonHttpMessageConverter
を使用)。 Spring 3.1現在、実装は非常にきれいに見えます。
@RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE,
method = RequestMethod.GET
value = "/foo/bar")
@ResponseBody
public Bar fooBar(){
return myService.getBar();
}
コメント:
まず、<mvc:annotation-driven />
または@EnableWebMvc
は、アプリケーション構成に 追加 である必要があります。
次に、@RequestMapping
注釈の produces 属性を使用して、応答のコンテンツタイプを指定します。したがって、 MediaType.APPLICATION_JSON_VALUE (または"application/json"
)に設定する必要があります。
最後に、ジャクソンを追加して、JavaとJSONの間のシリアライゼーションとデシリアライゼーションがSpringによって自動的に処理されるようにします(ジャクソンの依存関係はSpringによって検出され、MappingJacksonHttpMessageConverter
ボンネットの下にあります)。
ResponseEntity
の代わりにResponseBody
を使用します。これにより、応答ヘッダーにアクセスでき、適切なコンテンツタイプを設定できます。 Spring docs によると:
HttpEntity
は@RequestBody
および@ResponseBody
に似ています。リクエストとレスポンスの本文へのアクセスに加えて、HttpEntity
(およびレスポンス固有のサブクラスResponseEntity
)もリクエストとレスポンスのヘッダーへのアクセスを許可します
コードは次のようになります。
@RequestMapping(method=RequestMethod.GET, value="/fooBar")
public ResponseEntity<String> fooBar2() {
String json = "jsonResponse";
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setContentType(MediaType.APPLICATION_JSON);
return new ResponseEntity<String>(json, responseHeaders, HttpStatus.CREATED);
}
@ResponseBodyで実行できない場合がありますが、次のように機能します。
package xxx;
import Java.io.ByteArrayOutputStream;
import Java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class FooBar {
@RequestMapping(value="foo/bar", method = RequestMethod.GET)
public void fooBar(HttpServletResponse response) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
out.write(myService.getJson().getBytes());
response.setContentType("application/json");
response.setContentLength(out.size());
response.getOutputStream().write(out.toByteArray());
response.getOutputStream().flush();
}
}
これが可能だとは思わない。オープンなJiraが存在するようです:
org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
をメッセージコンバーターとして登録し、メソッドから直接オブジェクトを返します。
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="webBindingInitializer">
<bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"/>
</property>
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
</list>
</property>
</bean>
およびコントローラー:
@RequestMapping(method=RequestMethod.GET, value="foo/bar")
public @ResponseBody Object fooBar(){
return myService.getActualObject();
}
これには、依存関係org.springframework:spring-webmvc
が必要です。
response.setContentType(..)
を除いて、できるとは思わない