2013-03-12 26 views
12

Tôi đang cố gắng để gửi đến một dịch vụ còn lại sử dụng vào mùa xuân cho android (Tôi mới ở đây)đối tượng còn lại POST sử dụng mùa xuân cho android

Các dịch vụ yên tĩnh có cấu trúc

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

này với (mã đối tượng rút ngắn):

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

public class SearchOutRO implements Serializable { 
    private Integer searchId; 
} 

vì vậy tôi đang cố gắng này (từ android)

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

và nhận được ngoại lệ này:

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] 

Ông có thể giúp tôi chỉ ra những gì tôi làm sai (và làm thế nào làm cho nó phải).
Tôi nghĩ rằng nó có thể là "Cơ thể" MultiValueMap.

Cảm ơn trước

EDIT: tôi đã cố gắng những gì @Krisl gợi ý. Tôi thành công để kết nối với phía máy chủ, nhưng có vẻ như đối tượng là không chính xác marshalled.

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

Tôi sẽ đánh giá cao bất kỳ ý tưởng nào.

+0

Bạn có quyền truy cập vào các dữ liệu phía máy chủ các đối tượng ('SearchInRO',' SearchOutRO') ở phía máy khách? – Perception

+0

có, cả hai được thực hiện tại địa phương –

+1

Bạn nên sử dụng chúng sau đó, ở phía máy khách. Thay vì bản đồ nhiều giá trị, tạo một đối tượng 'SearchInRO', cư trú nó và lưu nó vào HttpEntity của bạn. Tôi cũng không nghĩ rằng bạn cần 'FormHttpMessageConverter'. – Perception

Trả lời

0

Tôi nghĩ bạn đang thiếu HttpMessageConverter đậu. Nếu bạn đang sản xuất và tiêu thụ dữ liệu JSON, cần có một số cách để chuyển đổi java POJO thành JSON và ngược lại. Thử thêm bean sau vào tệp xml ngữ cảnh của bạn.

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

Ngoài ra, bạn sẽ cần phải thêm phụ thuộc maven cho người lập bản đồ jackson.

<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

có vẻ như giả định của bạn là đúng, MultiValueMap đang gây ra sự cố.

Hãy thử điều này

Thay vì sử dụng MultiValueMap đặt lat và lng trong đối tượng SearchInRO và thêm nó.

Thay đổi

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

để

SearchInRO searchInRO = new SearchInRO(); 

thiết lập lat và lng

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

Ngoài ra thêm MappingJacksonHttpMessageConverter

messageConverters.add(new MappingJacksonHttpMessageConverter()); 

CẬP NHẬT: Tôi vừa kiểm tra một trong những dự án cũ của tôi sử dụng REST và nhận thấy rằng tôi đã sử dụng jersey-json jar cũng (trường hợp của tôi phụ thuộc maven).
Hãy thử thêm jar jersey-json này vào đường dẫn classpath của bạn và cập nhật web.xml như đưa ra dưới đây

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

Tôi đã thử cách này và giờ tôi gặp lỗi máy chủ 'Gây ra bởi: javax.xml.bind.UnmarshalException: yếu tố không mong muốn'. Có vẻ như nó không thể so sánh với loại json. –

+0

Bạn có lọ jackson trong đường dẫn lớp học của bạn – Kris

+0

có, jackson-core-asl và jackson-mapper-asl –

0

cách tiếp cận khác sử dụng jackson với một nhà văn để đi đến chuỗi trước khi bạn thiết lập các 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)); 
Các vấn đề liên quan