2016-08-15 9 views
12

पर मैप नहीं किया गया है मैं एक शानदार वेब सेवा को लागू करने के लिए वसंत का उपयोग कर रहा हूं। एंडपॉइंट्स में से एक अनुरोध जेएसओएन स्ट्रिंग में अनुरोध निकाय के रूप में होता है और मैं इसे पीओजेओ में मैप करना चाहता हूं। हालांकि, ऐसा लगता है कि पास-जेएसओएन स्ट्रिंग पीओजेओ में मैप की गई संपत्ति नहीं है।वसंत JSON अनुरोध निकाय जावा POJO

{"CustomerInfo":{"firstname":"xyz","lastname":"XYZ"}} 
साथ सामग्री प्रकार

आवेदन/json

होने के लिए निर्दिष्ट:

यहाँ @RestController इंटरफ़ेस

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

डाटा मॉडल

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

और अंत में मेरी पोस्ट अनुरोध है

हालांकि, जब मैं ऑब्जेक्ट मान मुद्रित करता हूं, तो डिफ़ॉल्ट मान ("पहला" और "आखिरी") मेरे द्वारा पारित मूल्य ("xyz" और "XYZ") के बजाय मुद्रित हो जाता है

क्या कोई जानता है मुझे उम्मीद क्यों नहीं मिल रही है?

ठीक

तो यह पता चला कि, अनुरोध शरीर के मूल्य में पारित नहीं किया है क्योंकि मैं न केवल मेरी इंटरफ़ेस में @RequestBody एनोटेशन की आवश्यकता है, लेकिन वास्तविक विधि लागू करने में। एक बार मेरे पास है, समस्या हल हो गई है।

+0

यदि आप उस जेसन को फ़्लैट करते हैं तो क्या होगा: '{" firstname ":" xyz "," lastname ":" XYZ "}' – mszymborski

+0

हाय @mszymborski, मैंने कोशिश की है लेकिन यह भी काम नहीं किया है। डिफ़ॉल्ट कन्स्ट्रक्टर का इस्तेमाल किया गया था। –

+0

'हेडर' का उपयोग करने के बजाय '@ requestMapping' में 'उपभोग' विशेषता का उपयोग करने का प्रयास करें। – 11thdimension

उत्तर

8

तो यह पता चला कि, अनुरोध शरीर के मूल्य में क्योंकि मैं न केवल मेरी इंटरफ़ेस में @RequestBody एनोटेशन की आवश्यकता नहीं पहुंचेगी कोशिश, लेकिन में वास्तविक विधि कार्यान्वयन। एक बार मेरे पास है, समस्या हल हो गई है।

1

इस पर स्वरूपण भयानक है, लेकिन यह जैक्सन कॉन्फ़िगरेशन के लिए काम करना चाहिए।

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

जैसा कि एक टिप्पणी में उल्लिखित है, आपका JSON आपके ऑब्जेक्ट के लिए गलत है।

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

आपके ऑब्जेक्ट के लिए सही JSON प्रतीत होता है। { "Firstname":

1

आप कई मायनों में यह कर सकते हैं, यहाँ मैं अलग तरीकों से नीचे

NOTE: अनुरोध डेटा shuld हो { "customerInfo" उस में करने जा रहा हूँ "xyz", "उपनाम" : "XYZ"}}

1st way हम

@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 नीचे के रूप में नक्शे के लिए डेटा ऊपर बाध्य कर सकते हैं हम इसे सीधे बाध्य कर सकते हैं POJO को

step 1 डीटीओ वर्ग UserInfo.java

public class UserInfo { 
    private CustomerInfo customerInfo1; 

    public CustomerInfo getCustomerInfo1() { 
     return customerInfo1; 
    } 

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

step 1. एक और डीटीओ वर्ग 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 बाँध अनुरोध शरीर डेटा

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

POJO बनाने मुझे आशा है कि यह आप बाहर मदद हो जाएगा पैदा करते हैं।धन्यवाद

+0

बहुत विस्तृत उत्तर के लिए आपको बहुत बहुत धन्यवाद। आपके द्वारा सुझाए गए सभी तरीकों से रूपांतरण चाल चल जाएगी। हालांकि वे मेरी समस्या का समाधान नहीं हैं, फिर भी मैं उन सभी को सीखकर खुश हूं। –

+0

क्या कोई नया जावा क्लास पेश करने या कुंजी-मूल्य जोड़े के मानचित्र पर मनमाने ढंग से मैप करने के बजाय इसे विधि पैरामीटर नाम पर बांधने का कोई तरीका है? – user1048931

-1

डिफ़ॉल्ट निर्माता से उन दो बयानों को हटाने और

संबंधित मुद्दे