sirve requestmapping requestbody que para mvc modelandview español ejemplo java json spring spring-mvc controller

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 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 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<String> fooBar2() { String json = "jsonResponse"; HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.setContentType(MediaType.APPLICATION_JSON); return new ResponseEntity<String>(json, responseHeaders, HttpStatus.CREATED); }