servicios servicio restcontroller que mvc ejemplo crear java json spring-mvc

java - servicio - Spring MVC: no deserializa el cuerpo de solicitud de JSON



spring mvc rest json (6)

En mi caso es porque el json no ha citado los nombres de los campos. Un ejemplo, esto no es aceptado:

{ entity: "OneEntity"}

pero este sí

{ "entity": "OneEntity"}

Todavía no he encontrado cómo puedo configurar el mapeo de objetos en el contexto de primavera. Sé que hay un JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES pero no sé cómo configurar eso para el mapeador de objetos.

Estoy trabajando en un proyecto Spring MVC y una de las tareas que necesito hacer es que tenga una cadena de datos JSON enviados por el usuario en una solicitud POST. Sé que Spring deserializará JSON utilizando Jackson para objetos, pero si pruebo algo como lo siguiente:

@RequestMapping(value = "/test", method = RequestMethod.POST) public void doSomething(@RequestBody String json) { // do something }

Simplemente devuelvo HTTP 400 Bad Request ("La solicitud enviada por el cliente fue sintácticamente incorrecta").

¿Cómo puedo obtener el JSON sin formato enviado por el cliente como una cadena?


Para mí, con la actualización de la versión de primavera, era simplemente un "necesario ahora." XXX "en lugar de XXX y todo funciona bien como lo tienes. Content-Type application / json


Podría tratar de evitar @RequestBody completo y en su lugar obtener el cuerpo de la solicitud directamente a través de un InputStream / Reader o un WebRequest / HttpServletRequest .


Por lo general, verá este tipo de error cuando Spring MVC encuentre una asignación de solicitud que coincida con la ruta de la URL, pero los parámetros (o encabezados o algo así) no coinciden con lo que espera el método del controlador.

Si usa la anotación @RequestBody, entonces creo que Spring MVC espera asignar el cuerpo completo de la solicitud POST a un objeto. Supongo que tu cuerpo no es simplemente un String, sino un objeto JSON completo.

Si tiene un modelo java del objeto JSON que espera, entonces podría reemplazar el parámetro String con eso en su declaración de "hacer algo", como

public void doSomething(@RequestBody MyObject myobj) {

Si no tiene un objeto Java que coincida con el JSON, podría tratar de hacerlo funcionar reemplazando el tipo String con un Map<String, Object> y vea si eso lo acerca a una solución funcional.

También puede activar el registro de depuración en Spring MVC para obtener más información sobre por qué fue una solicitud incorrecta.

Editar: Dado sus requisitos en los comentarios, puede simplemente insertar HttpServletRequest en su método y leer el cuerpo usted mismo.

public void doSomething(HttpServletRequest request) { String jsonBody = IOUtils.toString( request.getInputStream()); // do stuff }


Tuvimos una situación en la que queríamos algunos métodos de control para mapear el cuerpo de POST a beans , y otros métodos donde solo queríamos el String sin formato . Para lograr esto utilizando la anotación @RequestBody , debe configurar varios convertidores de mensajes, algo así como ...

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="useDefaultSuffixPattern" value="false"/> </bean> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="jsonConverter" /> <ref bean="marshallingConverter" /> <ref bean="stringHttpMessageConverter" /> </list> </property> </bean> <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes" value="application/json" /> </bean> <bean id="marshallingConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"> <constructor-arg ref="jaxb2Marshaller" /> <property name="supportedMediaTypes" value="application/xml"/> </bean> <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes" value="text/plain"/> </bean>

Luego, las solicitudes a los diversos métodos deben especificar el encabezado " content-type " con un valor apropiado. Para aquellos métodos donde el cuerpo de la solicitud se asigna a un bean JAXB , especifique " application/xml ". Y para aquellos donde el cuerpo de la solicitud es una Cadena , use " text/plain ".


si su tipo de contenido es "application / json" y su primer messageConvertor no es org.springframework.http.converter.StringHttpMessageConverter, Spring no pudo funcionar correctamente. En mi caso, hice esto:

<mvc:annotation-driven> <mvc:message-converters> <ref bean="stringHttpMessageConverter" /><!-- 放在前面,对@RequestBody String json 提供支持 --> <ref bean="mappingJacksonHttpMessageConverter" /> </mvc:message-converters> </mvc:annotation-driven> <!-- 消息转换器 --> <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <bean class="org.springframework.http.MediaType"> <constructor-arg index="0" value="text" /> <constructor-arg index="1" value="plain" /> <constructor-arg index="2" value="UTF-8" /> </bean> <bean class="org.springframework.http.MediaType"> <constructor-arg index="0" value="application" /> <constructor-arg index="1" value="json" /> <constructor-arg index="2" value="UTF-8" /> </bean> </list> </property> </bean> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <bean class="org.springframework.http.MediaType"> <constructor-arg index="0" value="text" /> <constructor-arg index="1" value="plain" /> <constructor-arg index="2" value="UTF-8" /> </bean> <bean class="org.springframework.http.MediaType"> <constructor-arg index="0" value="application" /> <constructor-arg index="1" value="json" /> <constructor-arg index="2" value="UTF-8" /> </bean> </list> </property> <!-- 设置时间格式, 有了这个就不用在pojo的属性上写了 --> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss"></constructor-arg> </bean> </property> </bean> </property> </bean>