【问题标题】:JaxRS read text/xml response MessageBodyProviderNotFoundExceptionJaxRS 读取文本/xml 响应 MessageBodyProviderNotFoundException
【发布时间】:2017-10-26 08:56:54
【问题描述】:

我想通过

消费一个返回 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);

但是我遇到了这个错误:MessageBodyReader not found for media type=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>

感谢阅读

【问题讨论】:

    标签: java xml api jersey jax-rs


    【解决方案1】:

    错误消息表明您的 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 );
    

    希望这会有所帮助, 安迪

    【讨论】:

    • 确实解决了,我的 POJO 上缺少 XMLRootElement 注释!谢谢大佬!
    • client.register() 解决了我的问题——在 tomcat servlet 环境中,在 ApplicationConfig 中调用 resources.add(...class) 是不够的,我有与客户端手动客户端。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多