web-dev-qa-db-fra.com

Corps de la demande Spring JSON non mappé à Java POJO

J'utilise Spring pour implémenter un service Web RESTful. L'un des noeuds finaux prend une chaîne JSON en tant que corps de requête et je souhaite la mapper à un POJO. Cependant, il semble maintenant que la chaîne JSON transmise ne soit pas une propriété mappée sur le POJO.

voici l'interface @RestController

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

le modèle de données

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

Et enfin ma demande POST:

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

avec Content-Type spécifié comme étant application/json

Cependant, lorsque j'imprime la valeur de l'objet, la valeur par défaut ("premier" et "dernier") est imprimée à la place de la valeur que j'ai transmise ("xyz" et "XYZ").

Est-ce que quelqu'un sait pourquoi je n'obtiens pas le résultat escompté?

RÉPARER 

Il s'est donc avéré que la valeur du corps de la demande n'est pas transmise, car l'annotation @RequestBody est nécessaire non seulement dans mon interface, mais également dans l'implémentation de la méthode. Une fois que j'ai cela, le problème est résolu.

16
Y. Chen

Il s'est donc avéré que la valeur du corps de la demande n'est pas transmise, car l'annotation @RequestBody est nécessaire non seulement dans mon interface, mais également dans l'implémentation de la méthode. Une fois que j'ai cela, le problème est résolu.

12
Y. Chen

Vous pouvez le faire de plusieurs façons. Ici, je vais le faire de différentes manières -

Les données de demande NOTE: doivent être {"customerInfo": {"prénom": "xyz", "nom": "XYZ"}}

1st way Nous pouvons relier les données ci-dessus à la carte comme ci-dessous

@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 nous pouvons le lier directement à pojo 

step 1 créer dto class UserInfo.Java

public class UserInfo {
    private CustomerInfo customerInfo1;

    public CustomerInfo getCustomerInfo1() {
        return customerInfo1;
    }

    public void setCustomerInfo1(CustomerInfo customerInfo1) {
        this.customerInfo1 = customerInfo1;
    }
}

step 1. créer un autre dto classCustomerInfo.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 lier les données du corps de la demande à 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
    }

J'espère que cela vous aidera. Merci

3
sanjeevjha

Le formatage est terrible, mais cela devrait fonctionner pour la configuration 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>

De plus, comme mentionné dans un commentaire, votre JSON est incorrect pour votre objet.

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

semble être le bon JSON pour votre objet.

1
DwB

Exemple de données:

[  
{  
  "targetObj":{  
     "userId":1,
     "userName":"Devendra"
  }
},
{  
  "targetObj":{  
     "userId":2,
     "userName":"Ibrahim"
  }
},
{  
  "targetObj":{  
     "userId":3,
     "userName":"Suraj"
  }
}
]

Pour les données ci-dessus, cette méthode de contrôleur de pring fonctionnant pour moi:

@RequestMapping(value="/saveWorkflowUser", method = RequestMethod.POST)
public void saveWorkflowUser (@RequestBody List<HashMap<String ,HashMap<String , 
  String>>> userList )  {
    System.out.println(" in saveWorkflowUser : "+userList);
 //TODO now do whatever you want to do.
}
0
Devendra Singraul