java - requestbody - requestmapping spring boot
En Spring MVC, ¿cómo puedo configurar el encabezado de tipo mime cuando uso @ResponseBody (7)
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 <mvc:annotation-driven />
o el @EnableWebMvc
deben added a la configuración de su aplicación.
A continuación, el atributo produces 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ó).
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?
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();
}
}
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;
}
}
No creo que esto sea posible. Parece que hay una Jira abierta para ello:
SPR-6702: respuesta explícitamente establecida Content-Type en @ResponseBody
No creo que puedas, aparte de response.setContentType(..)
Registre org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
como convertidor de mensajes y devuelva el objeto directamente desde el método.
<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>
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
.
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 deResponseEntity
) 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<String> fooBar2() {
String json = "jsonResponse";
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setContentType(MediaType.APPLICATION_JSON);
return new ResponseEntity<String>(json, responseHeaders, HttpStatus.CREATED);
}