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