En Spring MVC, ¿cómo puedo configurar el encabezado de tipo mime cuando uso @ResponseBody

Tengo un controlador Spring MVC que devuelve una cadena JSON y me gustaría configurar el tipo mimet para application / json. ¿Cómo puedo hacer eso?

@RequestMapping(method=RequestMethod.GET, value="foo/bar") @ResponseBody public String fooBar(){ return myService.getJson(); } 

Los objetos comerciales ya están disponibles como cadenas JSON, por lo que el uso de MappingJacksonJsonView no es la solución para mí. @ResponseBody es perfecto, pero ¿cómo puedo configurar el tipo MIME?

Consideraría refactorizar el servicio para devolver el objeto de dominio en lugar de las cadenas JSON y dejar que Spring maneje la serialización (a través del MappingJacksonHttpMessageConverter medida que escribe). A partir de Spring 3.1, la implementación parece bastante clara:

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

Comentarios:

Primero, el o el @EnableWebMvc deben agregar a la configuración de su aplicación.

A continuación, el atributo produce de la anotación @RequestMapping se usa para especificar el tipo de contenido de la respuesta. En consecuencia, debe establecerse en MediaType.APPLICATION_JSON_VALUE (o "application/json" ).

Por último, se debe agregar Jackson para que la serialización y deserialización entre Java y JSON sea manejada automáticamente por Spring (la dependencia de Jackson es detectada por Spring y el MappingJacksonHttpMessageConverter estará bajo el capó).

Use ResponseEntity lugar de ResponseBody . De esta manera, tiene acceso a los encabezados de respuesta y puede establecer el tipo de contenido apropiado. De acuerdo con los documentos de Spring :

La HttpEntity es similar a @RequestBody y @ResponseBody . Además de obtener acceso al cuerpo de solicitud y respuesta, HttpEntity (y la subclase específica de ResponseEntity ) también permite el acceso a los encabezados de solicitud y respuesta.

El código se verá así:

 @RequestMapping(method=RequestMethod.GET, value="/fooBar") public ResponseEntity fooBar2() { String json = "jsonResponse"; HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.setContentType(MediaType.APPLICATION_JSON); return new ResponseEntity(json, responseHeaders, HttpStatus.CREATED); } 

Es posible que no puedas hacerlo con @ResponseBody, pero algo como esto debería funcionar:

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

No creo que esto sea posible. Parece que hay una Jira abierta para ello:

SPR-6702: respuesta explícitamente establecida Content-Type en @ResponseBody

Registre org.springframework.http.converter.json.MappingJacksonHttpMessageConverter como convertidor de mensajes y devuelva el objeto directamente desde el método.

           

y el controlador:

 @RequestMapping(method=RequestMethod.GET, value="foo/bar") public @ResponseBody Object fooBar(){ return myService.getActualObject(); } 

Esto requiere la dependencia org.springframework:spring-webmvc .

No creo que puedas, aparte de response.setContentType(..)

Mi versión de la realidad. Cargando un archivo HTML y transmitiéndolo al navegador.

 @Controller @RequestMapping("/") public class UIController { @RequestMapping(value="index", method=RequestMethod.GET, produces = "text/html") public @ResponseBody String GetBootupFile() throws IOException { Resource resource = new ClassPathResource("MainPage.html"); String fileContents = FileUtils.readFileToString(resource.getFile()); return fileContents; } }