javax.xml.bind.UnmarshalException 当请求 rest json service with



我有一个返回json列表的休息网络服务(带有jersey),如果我直接调用它,它返回的正是这个:

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

我找不到它来自哪里?

修改代码以像这样设置客户端:

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

遇到了完全相同的问题,直到这个问题及其答案为我指明了正确的方向。

这种情况是由用于与 JSON 进行序列化的默认 jersey-json 模块引起的,该模块无法正确处理某些 JSON 构造。

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

查看有关使用 JSON 的泽西岛客户端文档。看起来您至少缺少注释:

@Produces("application/json")

但是,您也可能缺少客户端和服务器端的 POJO 映射功能筛选器。这些似乎都是微小的配置更改。

最新更新