3

我正在使用 Jersey 1.1(旧的,我知道 - 因为我坚持使用 Java 1.5)。我正在做一个简单的 GET,其中一个 Java 对象作为实体返回。Java 对象正在正确编组(Java 到 XML),因为我可以通过 Web 发出 GET 请求并且效果很好。我正在尝试使用 Jersey 客户端发出 GET 请求并将其解组回 Java 对象,这就是它失败的地方。Jersey 不应该知道如何将它从 GET 请求中接收到的 XML 解组回 POJO,因为它已正确注释吗?它在服务器端工作。这是我得到的例外:

ClientHandlerException: A message body reader for Java type, class my.class.SearchResult, and MIME media type, application/xml was not found.

这是客户端代码:

private SearchResult search() {
    WebResource wr = new Client().resource( "http://localhost:8080/MyProject/search" );
    return wr.get( SearchResult.class );
}

这是我在客户端和服务器上使用的带有 JAXB 注释的 POJO:

@XmlRootElement(name = "searchResults")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "searchResults", propOrder = {
    "results"
})
public class SearchResult {
    @XmlElement(name = "result")
    private List<Result> results = new ArrayList<Result>();

    public List<Result> getResults() {
        return results;
    }
    ...
}

这也是内部 Result POJO:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "resultType", propOrder = {
    "name",
    "version",
    "type"
})
public class Result {
    private String name;
    private String version;
    private String type;
    ...
}

这是 GET 服务本身:

@Path("/search")
public class SearchRest {
    @GET
    @Produces(MediaType.APPLICATION_XML)
    public SearchResult search() {
        SearchResult result = new SearchResult();
        ....
        return result;
    }
}

谢谢!

4

2 回答 2

3

@XmlRootElement注释添加到您的Result班级。

于 2012-05-17T14:54:03.630 回答
3

我通过在客户端将 JAXB jar 添加到我的类路径中解决了这个问题。我不知道为什么这解决了这个问题,但我猜这是因为我的 POJO 中的 @XmlRootElement 和其他 JAXB 注释在运行时被简单地忽略了,因为 jar 不存在。这导致 Jersey 没有检测到注释,因此认为它无法在客户端的 xml 和 POJO 之间进行转换。当我尝试避免需要注释的替代方法时,我发现了解决方案,您将根 POJO 包装在 JAXBElement 中。我更新了 Web 服务类以生成 JAXBElement 并更新了客户端以期望相同。然后我得到了一个 NoClassDefFoundError ,它更能说明缺少的罐子,因为我直接引用了 JAXBElement。我想我很幸运。

于 2012-05-17T17:29:59.800 回答