12

Android用のSpringを使用して残りのサービスにPOSTしようとしています(私はこれが初めてです)

安らかなサービスはこの構造を持っています

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

with(短縮されたオブジェクトコード):

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]

私が間違っていることを指摘するのを手伝ってもらえますか? (そして、それを正しくする方法)。
「本体」のMultiValueMapである可能性があると思います。

前もって感謝します

編集: @Krislが提案したことを試しました。サーバー側への接続には成功しましたが、オブジェクトが正しくマーシャリングされていないようです。

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

アイデアをいただければ幸いです。

4

3 に答える 3

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());

更新: REST を使用する古いプロジェクトの 1 つを確認したところ、jersey-json jar も使用していることに気付きました (私の場合は maven の依存関係)。
これを試して jersey-json jar をクラスパスに追加し、以下のように web.xml を更新します

<init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
于 2013-03-12T06:06:05.237 に答える
0

HttpEntityを設定する前に、ライターでjacksonを使用して文字列に移動するdiffアプローチ...

参照

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));
于 2013-03-24T21:49:13.530 に答える
0

HttpMessageConverterあなたには豆が欠けていると思います。JSON データを作成および使用している場合は、Java POJO を JSON に、またはその逆に変換する方法が必要です。コンテキスト xml ファイルに次の Bean を追加してみてください。

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

また、jackson マッパーの Maven 依存関係を追加する必要があります。

<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>
于 2013-03-12T06:05:52.000 に答える