web-dev-qa-db-ger.com

Der Spring-JSON-Anforderungstext wurde keinem Java-POJO zugeordnet

Ich verwende Spring, um einen RESTful-Webdienst zu implementieren. Einer der Endpunkte enthält einen JSON-String als Anforderungstext, und ich möchte ihn einem POJO zuordnen. Es scheint jedoch jetzt, dass die übergebene JSON-Zeichenfolge nicht dem POJO zugeordnet ist.

hier ist die @RestController-Schnittstelle

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

das Datenmodell

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

Und zum Schluss meine POST - Anfrage:

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

wobei Content-Type als application/json angegeben wurde

Beim Ausdrucken des Objektwerts wurde jedoch der Standardwert ("first" und "last") anstelle des von mir übergebenen Werts ("xyz" und "XYZ") ausgedruckt.

Weiß jemand, warum ich nicht das erwartete Ergebnis bekomme?

FIX 

Es stellte sich also heraus, dass der Wert des Anforderungshauptteils nicht übergeben wird, da ich die Annotation @RequestBody nicht nur in meiner Schnittstelle, sondern in der tatsächlichen Methodenimplementierung haben muss. Sobald ich das habe, ist das Problem gelöst.

16
Y. Chen

Es stellte sich also heraus, dass der Wert des Anforderungshauptteils nicht übergeben wird, da ich die Annotation @RequestBody nicht nur in meiner Schnittstelle, sondern in der tatsächlichen Methodenimplementierung haben muss. Sobald ich das habe, ist das Problem gelöst.

12
Y. Chen

Sie können es auf viele Arten tun. Hier werde ich es auf verschiedene Weise tun.

NOTE: Anfragedaten sollten {"customerInfo" sein: {"Vorname": "xyz", "Nachname": "XYZ"}}

1st way Wir können die obigen Daten wie folgt an die Karte binden

@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 wir können es direkt an pojo binden 

step 1 dto-Klasse erstellen UserInfo.Java

public class UserInfo {
    private CustomerInfo customerInfo1;

    public CustomerInfo getCustomerInfo1() {
        return customerInfo1;
    }

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

step 1. eine weitere dto-Klasse anlegenCustomerInfo.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 bindet die Body-Daten der Anfrage an das 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
    }

Ich hoffe es wird dir helfen. Vielen Dank

3
sanjeevjha

Die Formatierung hier ist schrecklich, aber dies sollte für die Jackson-Konfiguration funktionieren.

<!-- 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>

Wie auch in einem Kommentar erwähnt, ist Ihre JSON für Ihr Objekt falsch.

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

scheint die richtige JSON für Ihr Objekt zu sein.

1
DwB

Beispieldaten :

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

Für die obigen Daten funktioniert diese Pring-Controller-Methode für mich:

@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