未找到Java类型的Jersey客户端消息正文阅读器

时间:2012-05-16 18:45:35

标签: xml rest jaxb jersey

我正在使用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;
    }
    ...
}

这里也是内部结果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;
    }
}

谢谢!

2 个答案:

答案 0 :(得分:3)

@XmlRootElement注释添加到Result类。

答案 1 :(得分:3)

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