JaxRS读取text / xml响应MessageBodyProviderNotFoundException

时间:2017-05-25 16:08:44

标签: java xml api jersey jax-rs

我想通过

使用返回XML数据的webservice
    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

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>

感谢您阅读

1 个答案:

答案 0 :(得分:2)

错误消息表明您的JAX-RS实现无法将XML转换为POJO(ResponseRecherche)。 JAX-RS使用MessageBodyReaders将响应实体转换为Java对象。所有JAX-RS实现都需要提供一组内置的MessageBodyReaders,但用户可以提供自己的自定义转换。

您可能有两种解决方案: 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,它可以将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 );

希望这有帮助, 安迪