2013-03-12 10 views
12

मैं एंड्रॉयड के लिए वसंत का उपयोग कर एक आराम सेवा पर पोस्ट करने के लिए कोशिश कर रहा हूँ वसंत का उपयोग कर वस्तुबाकी पोस्ट एंड्रॉयड

शोकहारा सेवा के साथ इस संरचना

@POST 
@Path("/ider") 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public SearchOutRO hashTrackInJSON(SearchInRO in); 

है (मैं इस पर नया हूँ) (छोटा वस्तु कोड):

public class SearchInRO implements Serializable { 
    private Double latitud; 
    private Double longitud; 
} 

public class SearchOutRO implements Serializable { 
    private Integer searchId; 
} 

तो मैं इस (एंड्रॉयड से)

String url = BASE_URL + "ider"; 
HttpHeaders requestHeaders = new HttpHeaders(); 

requestHeaders.setContentType(MediaType.APPLICATION_JSON); 

MultiValueMap<String, String> body = new LinkedMultiValueMap<String, String>(); 
body.add("searchInRO[latitud]", String.valueOf(user.getLatitud())); 
body.add("searchInRO[longitud]", String.valueOf(user.getLongitud())); 

HttpEntity<?> requestEntity = new HttpEntity<Object>(body, requestHeaders); 
RestTemplate restTemplate = new RestTemplate(); 

List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>(); 
messageConverters.add(new FormHttpMessageConverter()); 
messageConverters.add(new StringHttpMessageConverter()); 
restTemplate.setMessageConverters(messageConverters); 
try { 
    ResponseEntity<SearchOutRO> response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, SearchOutRO.class); 

    HttpStatus status = response.getStatusCode(); 
    if (status == HttpStatus.CREATED) { 
     return true; 
    } else { 
     return false; 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
    return false; 
} 
कोशिश कर रहा हूँ

और यह अपवाद हो रही:

org.springframework.web.client.RestClientException: Could not write request: no suitable HttpMessageConverter found for request type [org.springframework.util.LinkedMultiValueMap] and content type [application/json] 

तुम मुझे उनका कहना है कि मैं क्या गलत कर रहा हूँ मदद कर सके (और कैसे बनाने के यह सही)।
मुझे लगता है कि यह "बॉडी" मल्टीवैल्यूमैप हो सकता है।

अग्रिम

धन्यवाद

संपादित करें: मैंने कोशिश की क्या @Krisl का सुझाव दिया। मैं सर्वर की ओर से कनेक्ट करने में सफल रहता हूं, लेकिन ऐसा लगता है कि ऑब्जेक्ट सही ढंग से मार्शल नहीं किया गया है।

WARNING: javax.xml.bind.UnmarshalException 
- with linked exception: 
[javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"latitud"). Expected elements are <{}searchInRO>] 

मैं किसी भी विचार की सराहना करता हूं।

+0

आप सर्वर साइड डेटा तक पहुँच है ऑब्जेक्ट्स ('SearchInRO', 'SearchOutRO') क्लाइंट साइड पर? – Perception

+0

हां, दोनों स्थानीय रूप से कार्यान्वित –

+1

आपको क्लाइंट पक्ष पर तब उनका उपयोग करना चाहिए। बहु-मूल्य मानचित्र के बजाय, 'SearchInRO' ऑब्जेक्ट बनाएं, इसे पॉप्युलेट करें, और इसे अपने HttpEntity में संग्रहीत करें। मुझे यह भी नहीं लगता कि आपको 'FormHttpMessageConverter' की आवश्यकता है। – Perception

उत्तर

0

मुझे लगता है कि आप HttpMessageConverter बीन गायब हैं। यदि आप जेएसओएन डेटा का उत्पादन और उपभोग कर रहे हैं, तो जावा पीओजेओ को जेएसओएन और इसके विपरीत रूपांतरित करने का कोई तरीका होना चाहिए। अपने संदर्भ xml फ़ाइल में निम्नलिखित बीन जोड़ने का प्रयास करें।

<beans:bean id="jacksonMessageChanger" 
    class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
    <beans:property name="supportedMediaTypes" value="application/json" /> 
</beans:bean> 

<beans:bean 
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <beans:property name="messageConverters"> 
     <util:list id="beanList"> 
      <beans:ref bean="jacksonMessageChanger" /> 
     </util:list> 
    </beans:property> 
</beans:bean> 

इसके अलावा आपको जैक्सन मैपर के लिए मेवेन निर्भरता जोड़ने की आवश्यकता होगी।

<dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-core-asl</artifactId> 
    <version>1.8.5</version> 
</dependency> 
<dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-mapper-asl</artifactId> 
    <version>1.8.5</version> 
</dependency> 
4

ऐसा लगता है कि आपकी धारणा सही है, MultiValueMap समस्या का कारण बन रहा है।

इस

इसके बजाय MultiValueMap का उपयोग करने का

अक्षां और SearchInRO वस्तु में एलएनजी की स्थापना की और इसे जोड़ने के लिए प्रयास करें।

बदलें

HttpEntity<?> requestEntity = new HttpEntity<Object>(body, requestHeaders); 

को
SearchInRO searchInRO = new SearchInRO(); 

अक्षां और एलएनजी

HttpEntity<?> requestEntity = new HttpEntity<Object>(searchInRO , requestHeaders); 

इसके अलावा MappingJacksonHttpMessageConverter

messageConverters.add(new MappingJacksonHttpMessageConverter()); 
0 जोड़ने सेट

अद्यतन: मैंने अभी अपनी पुरानी परियोजना में से एक की जांच की है जो आरईएसटी का उपयोग करता है और ध्यान दिया कि मैंने जर्सी-जेसन जार भी इस्तेमाल किया (मेरा मामला मेवेन निर्भरता)।
अपने क्लासपाथ में जर्सी-जेसन जार जोड़ें और वेब अपडेट करें।एक्सएमएल की तरह नीचे दिए गए

<init-param> 
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
     <param-value>true</param-value> 
    </init-param> 
+0

पर "जावा कोर" lib नहीं जोड़ सकता है, मैंने कोशिश की है, और अब मुझे सर्वर त्रुटि 'के कारण: javax.xml.bind.UnmarshalException: अप्रत्याशित तत्व' प्राप्त होता है। ऐसा लगता है कि यह जेसन प्रकार के लिए मार्शल में विफल रहता है। –

+0

क्या आपके पास अपने क्लासपाथ – Kris

+0

हां, जैक्सन-कोर-एएसएल और जैक्सन-मैपर-एएसएल –

0

diff दृष्टिकोण एक लेखक के साथ जैक्सन उपयोग करने से पहले आप HttpEntity सेट स्ट्रिंग पर जाने के लिए ...

ref

ObjectNode rootOb = new ObjectMapper().createObjectNode(); 
    { create obj nodes , adding each to rootNode } 
    {jackson api to go to string } 

    StringWriter writer = new StringWriter(); 
    new ObjectMapper().writeValue(writer, rootOb); 
    String poststr=writer.toString(); 

httpPost.setEntity(new StringEntity(poststr)); 
संबंधित मुद्दे