In Spring MVC, how can I set the mime type header when using @ResponseBody In Spring MVC, how can I set the mime type header when using @ResponseBody java java

In Spring MVC, how can I set the mime type header when using @ResponseBody


Use ResponseEntity instead of ResponseBody. This way you have access to the response headers and you can set the appropiate content type. According to the Spring docs:

The HttpEntity is similar to @RequestBody and @ResponseBody. Besides getting access to the request and response body, HttpEntity (and the response-specific subclass ResponseEntity) also allows access to the request and response headers

The code will look like:

@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);}


I would consider to refactor the service to return your domain object rather than JSON strings and let Spring handle the serialization (via the MappingJacksonHttpMessageConverter as you write). As of Spring 3.1, the implementation looks quite neat:

@RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE,     method = RequestMethod.GET    value = "/foo/bar")@ResponseBodypublic Bar fooBar(){    return myService.getBar();}

Comments:

First, the <mvc:annotation-driven /> or the @EnableWebMvc must be added to your application config.

Next, the produces attribute of the @RequestMapping annotation is used to specify the content type of the response. Consequently, it should be set to MediaType.APPLICATION_JSON_VALUE (or "application/json").

Lastly, Jackson must be added so that any serialization and de-serialization between Java and JSON will be handled automatically by Spring (the Jackson dependency is detected by Spring and the MappingJacksonHttpMessageConverter will be under the hood).


You may not be able to do it with @ResponseBody, but something like this should work:

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;@Controllerpublic 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();  }}