tutorial services mvc example ejemplo java json spring spring-mvc jackson

services - Cuerpo de solicitud de Spring JSON no asignado a Java POJO



spring web services example (4)

Estoy usando Spring para implementar un servicio web RESTful. Uno de los puntos finales tiene una cadena JSON como cuerpo de solicitud y deseo asignarlo a un POJO. Sin embargo, parece ahora que la cadena JSON pasada no está mapeada de propiedad al POJO.

aquí está la interfaz @RestController

@RequestMapping(value="/send", headers="Accept=application/json", method=RequestMethod.POST) public void sendEmails(@RequestBody CustomerInfo customerInfo);

el modelo de datos

public class CustomerInfo { private String firstname; private String lastname; public CustomerInfo() { this.firstname = "first"; this.lastname = "last"; } public CustomerInfo(String firstname, String lastname) { this.firstname = firstname; this.lastname = lastname; } public String getFirstname(){ return firstname; } public void setFirstname(String firstname){ this.firstname = firstname; } public String getLastname(){ return lastname; } public void getLastname(String lastname){ this.lastname = lastname; } }

Y finalmente mi solicitud POST:

{"CustomerInfo":{"firstname":"xyz","lastname":"XYZ"}}

con Content-Type especificado para ser application / json

Sin embargo, cuando imprimo el valor del objeto, el valor predeterminado ("primero" y "último") se imprimió en lugar del valor que pasé ("xyz" y "XYZ")

¿Alguien sabe por qué no obtengo el resultado que esperaba?

FIJAR

Así que resultó que, el valor del cuerpo de la solicitud no se transfiere porque necesito tener la anotación @RequestBody no solo en mi interfaz, sino también en la implementación real del método. Una vez que tengo eso, el problema está resuelto.


El formateo de esto es terrible, pero esto debería funcionar para la configuración de jackson.

<!-- Use Jackson for JSON conversion (POJO to JSON outbound). --> <bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> <!-- Use JSON conversion for messages --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="jsonMessageConverter"/> </list> </property> </bean>

Además, como se menciona en un comentario, su JSON es incorrecto para su objeto.

{"firstname":"xyz",‌​"lastname":"XYZ"}

parece ser el JSON correcto para su objeto.


Puedes hacerlo de muchas maneras, aquí voy a hacerlo de diferentes maneras-

NOTE: datos de solicitud deben ser {"customerInfo": {"firstname": "xyz", "lastname": "XYZ"}}

1st way Podemos vincular los datos anteriores al mapa como se muestra a continuación

@RequestMapping(value = "/send", headers = "Accept=application/json", method = RequestMethod.POST) public void sendEmails(@RequestBody HashMap<String, HashMap<String, String>> requestData) { HashMap<String, String> customerInfo = requestData.get("customerInfo"); String firstname = customerInfo.get("firstname"); String lastname = customerInfo.get("lastname"); //TODO now do whatever you want to do. }

2nd way que podemos unirlo directamente a pojo

step 1 crear la clase dto UserInfo.java

public class UserInfo { private CustomerInfo customerInfo1; public CustomerInfo getCustomerInfo1() { return customerInfo1; } public void setCustomerInfo1(CustomerInfo customerInfo1) { this.customerInfo1 = customerInfo1; } }

step 1. crea otra clase dto CustomerInfo.java

class CustomerInfo { private String firstname; private String lastname; public String getFirstname() { return firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } public String getLastname() { return lastname; } public void setLastname(String lastname) { this.lastname = lastname; } }

step 3 vincular los datos del cuerpo de la solicitud al pojo

@RequestMapping(value = "/send", headers = "Accept=application/json", method = RequestMethod.POST) public void sendEmails(@RequestBody UserInfo userInfo) { //TODO now do whatever want to do with dto object }

Espero que te ayude. Gracias


Así que resultó que, el valor del cuerpo de la solicitud no se transfiere porque necesito tener la anotación @RequestBody no solo en mi interfaz, sino también en la implementación real del método. Una vez que tengo eso, el problema está resuelto.


eliminar esas dos declaraciones del constructor predeterminado y probar