使用jersey客户端请求rest json服务时的javax.xml.bind.UnmarshalException

时间:2012-04-13 08:12:31

标签: json rest jersey

我有一个休息的webservice(带有jersey),它返回json列表,如果我直接调用它就会返回这个:

[{"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>

我找不到它的来源?

2 个答案:

答案 0 :(得分:1)

修改代码以设置您的客户端,如下所示:

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

this question and its answers指出正确的方向之前,我遇到了完全相同的问题。

这种情况是由用于与JSON进行序列化的默认jersey-json module引起的,JSON没有正确处理某些JSON结构。

您可以将FEATURE_POJO_MAPPING标志设置为使用Jackson库的JacksonJsonProvider进行JSON序列化。

答案 1 :(得分:0)

查看Jersey Client side doc on using JSON。看起来你至少错过了注释:

@Produces("application/json")

但您也可能缺少客户端和服务器端的POJO Mapping功能过滤器。这些似乎都是微小的配置变化。