Xml 找不到Java类型的Jersey客户端消息正文读取器

Xml 找不到Java类型的Jersey客户端消息正文读取器,xml,rest,jaxb,jersey,Xml,Rest,Jaxb,Jersey,我使用的是Jersey 1.1(我知道这很旧,因为我一直在使用Java1.5)。我正在做一个简单的GET,其中一个Java对象作为实体返回。Java对象被正确地编组(Java到XML),因为我可以通过web发出GET请求,而且效果很好。我试图使用Jersey客户端发出GET请求并将其解组回Java对象,这就是它失败的地方。Jersey不应该知道如何将它从GET请求接收到的XML解组到POJO中,因为它的注释是正确的吗?它在服务器端工作。以下是我得到的一个例外: ClientHandlerExce

我使用的是Jersey 1.1(我知道这很旧,因为我一直在使用Java1.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;
    }
    ...
}
下面是GET服务本身:

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

谢谢大家!

@XmlRootElement
注释添加到
结果
类。

我通过将JAXB JAR添加到客户端的类路径中解决了这个问题。我不知道这为什么解决了这个问题,但我猜这是因为我的POJO中的@XmlRootElement和其他JAXB注释在运行时被忽略了,因为JAR不存在。这导致Jersey没有检测到注释,因此认为它无法在客户端的xml和POJO之间进行转换。当我尝试另一种避免注释的方法时,我发现了这个解决方案,即将根POJO封装在一个JAXBElement中。我更新了web服务类以生成JAXBElement,并更新了客户机以获得相同的结果。然后我得到了一个NoClassDefFoundError,它更能指示丢失的JAR,因为我直接引用了JAXBElement。我想我是幸运的。

你能提供你的
结果吗
类?我用结果编辑了这篇文章,类可能自己找到了解决方案。我认为将jaxb JAR放在我的类路径中解决了这个问题。我没有得到任何错误来表明它们不存在,但我猜@XmlRootElement注释在运行时被忽略了,因为我的类路径中没有jaxb JAR。对此有何想法?请看我上面的评论,我想我已经解决了。但是关于你的建议,我为什么要指出结果是根元素呢。我怎么能有两个根元素?SearchResult类已注释为根。它包含结果对象的列表。
@Path("/search")
public class SearchRest {
    @GET
    @Produces(MediaType.APPLICATION_XML)
    public SearchResult search() {
        SearchResult result = new SearchResult();
        ....
        return result;
    }
}