2

jsonリストを返す残りのWebサービス(ジャージー付き)があります。直接呼び出すと、正確にこれが返されます:

[{"success":false,"uri":"foo:22","message":"Unknown host : foo"},{"success":true,"uri":"localhost:8082","message":null}]

このスニペットによって生成されます:

@GET
@Path("/opening/")
public List<OpeningResult> testOpenings(@QueryParam("uri") List<String> uris) {
    LOG.debug("testOpenings request uris :[" + uris + "]");
    List<OpeningResult> openingResults = infoService.testOpenings(uris);
    return openingResults;
}

これは、次のような Pojo のコレクションです。

@XmlRootElement(name = "OpeningResult")
public class OpeningResult {

attributes
...
getter/setter

}

この Pojo は、サーバーとクライアントの間で共通の jar を介して共有されます。

私はこのスニペットでWebサービスを呼び出します:

Client client = Client.create();
WebResource resource = client.resource("http://localhost:8080/scheduler/rest/opening");
MultivaluedMap<String, String> params = new MultivaluedMapImpl();
for (String uri : uris) {
    params.add("uri", uri);
}
List<OpeningResult> results = newArrayList(resource.queryParams(params).get(OpeningResult[].class));

サーバー側にいくつかのトレースを追加します。残りのサービスが適切なパラメーターで呼び出されていることがわかりますが、クライアント側では次のエラーが発生します。

Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"success"). Expected elements are <{}OpeningResult>

どこから来たのかわかりませんか?

4

2 に答える 2

1

コードを変更して、クライアントを次のように設定します。

ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, true);
Client client = Client.create(clientConfig);

この質問とその回答が私を正しい方向に向けるまで、私はまったく同じ問題を抱えていました。

この状況は、JSON との間のシリアル化に使用されるデフォルトのjersey-json モジュールが原因で発生します。これは、特定の JSON 構造を適切に処理しません。

FEATURE_POJO_MAPPING代わりに、JSON シリアル化に Jackson ライブラリの JacksonJsonProvider を使用するようにフラグを設定できます。

于 2013-03-05T14:17:48.133 に答える
0

JSON の使用に関する Jersey クライアント側のドキュメントを確認してください。少なくとも注釈が欠けているようです:

@Produces("application/json")

ただし、クライアント側とサーバー側の両方の POJO マッピング機能フィルターが欠落している可能性もあります。これらはすべてマイナーな構成変更のようです。

于 2012-04-17T13:42:47.450 に答える