我想使用通过以下方式返回XML数据的Web服务
Client client = ClientBuilder.newClient();
String seLogerAPI = "http://ws.seloger.com/search.xml";
// Defining some query params. Full doc : https://github.com/bodinsamuel/seloger-php/blob/master/API.md
// More : https://github.com/pasnox/housing/blob/master/SeLoger.com.api.txt
WebTarget target = client.target(seLogerAPI)
.queryParam("idtypebien", "1") // apartements
.queryParam("idtt", "1") // Renting
.queryParam("nb_pieces", "5")
.queryParam("cp", "95330")
;
Response result = target.request(MediaType.TEXT_XML_TYPE).get();
ResponseRecherche res = result.readEntity(new GenericType<ResponseRecherche>() {});
System.out.println(res);
但是我遇到了这个错误:找不到媒体类型= text / xml; charset = utf-8的MessageBodyReader
Response result = target.request(MediaType.TEXT_XML_TYPE).get();
工作正常,但当我尝试通过使用将其放入POJO中时
ResponseRecherche res = result.readEntity(new GenericType<ResponseRecherche>() {});
引发org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException ...
仅供参考:ResponseRecherche是一个POJO,其结构与Web服务的答案相同。我正在关注本教程:https://vaadin.com/blog/-/blogs/consuming-rest-services-from-java-applications
我不太明白为什么
我的pom.xml
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.25</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-jaxb</artifactId>
<version>2.25</version>
</dependency>
谢谢阅读
最佳答案
错误消息表明您的JAX-RS实现无法将XML转换为POJO(ResponseRecherche)。 JAX-RS使用MessageBodyReaders将响应实体转换为Java对象。所有JAX-RS实现都需要提供一组内置的MessageBodyReader,但是用户可以提供自己的自定义转换。
您可能有两种解决方案:
1)使用内置的JAXB MessageBodyReader-为此,您将需要使用JAXB批注(例如@XmlRootElement等)对POJO进行批注。有关如何将JAXB与JAX-RS一起使用的一个很好的教程-包括如何注释对象类。在这里找到:
https://dennis-xlc.gitbooks.io/restful-java-with-jax-rs-2-0-2rd-edition/en/part1/chapter6/jaxb.html
2)创建并注册您自己的MessageBodyReader,该MessageBodyReader可以将XML从远程站点转换为ResponseRecherche对象。该教程还提供了一些有关如何在此处创建自定义MessageBodyReaders的良好信息:
https://dennis-xlc.gitbooks.io/restful-java-with-jax-rs-2-0-2rd-edition/en/part1/chapter6/custom_marshalling.html
请注意,由于您正在使用JAX-RS客户端API,因此您将需要显式注册自定义MessageBodyReader,如下所示:
Client client = ClientBuilder.newClient();
client.register( MyMessageBodyReader.class );
希望这可以帮助,
安迪