【问题标题】:MessageBodyReader not found for media type=application/octet-stream未找到媒体类型 = 应用程序/八位字节流的 MessageBodyReader
【发布时间】:2013-11-19 17:25:51
【问题描述】:

我正在尝试使用以下代码 sn-p 从http://api.openweathermap.org/data/2.5/forecast/daily?lat=35&lon=139&cnt=10&mode=json 接收 json 数据:

private WebTarget getWebTarget() {
    Client client = JerseyClientBuilder.newClient();
    return client.target("http://api.openweathermap.org/")
            .path("data")
            .path("2.5");
}

// new one method
    Response response = getWebTarget()
                        .path("daily")
                        .queryParam("q", String.format("%s,%s", town, countryCode))
                        .queryParam("cnt", 10)
                        .queryParam("mode", "json")
                        .request().accept(MediaType.APPLICATION_JSON_TYPE).get();
    WeatherForecast forecast = response.readEntity(WeatherForecast.class);

但最后一行抛出:

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: 未找到媒体类型 = 应用程序/八位字节流的 MessageBodyReader, 类型=类 com.app.weather.providers.org.openweathermap.pojo.WeatherForecast, genericType=类 com.app.weather.providers.org.openweathermap.pojo.WeatherForecast。

pom.xml 中的泽西依赖关系:

<dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet-core</artifactId>
            <version>2.4</version>
            <!-- use the following artifactId if you don't need servlet 2.x compatibility -->
            <!-- artifactId>jersey-container-servlet</artifactId -->
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-moxy</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-multipart</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json</artifactId>
            <version>2.0-m05-1</version>
        </dependency>

此代码在应用程序服务器之外运行。谢谢。

【问题讨论】:

    标签: java json rest maven jersey


    【解决方案1】:

    Jersey JSON 支持作为一组扩展模块提供,其中每个模块都包含 Feature 的实现,需要将其注册到您的 Configurable 实例(客户端/服务器)中。有多个框架支持 JSON 处理和/或 JSON 到 Java 的绑定。下面列出的模块通过将各个 JSON 框架集成到 Jersey 中来提供对 JSON 表示的支持。目前,Jersey 集成了以下模块来提供 JSON 支持:

    • MOXy - 自 Jersey 2.0 以来,通过 MOXy 的 JSON 绑定支持是在您的 Jersey 应用程序中支持 JSON 绑定的默认和首选方式。当 JSON MOXy 模块位于类路径上时,Jersey 将自动发现该模块并通过 MOXy 在您的应用程序中无缝启用 JSON 绑定支持。 (请参阅第 4.3 节“自动发现的功能”。)
    • 用于 JSON 处理的 Java API (JSON-P)
    • 杰克逊
    • 抛弃

    有关更多信息,请阅读球衣文档的chapter 9

    Moxy 是 json 媒体支持的建议方法。 MOXy 媒体模块是您不需要在客户端/服务器中显式注册其功能 (MoxyJsonFeature) 的模块之一 可配置,因为当您将 jersey-media-moxy 模块添加到您的类路径时会自动发现和注册此功能.

    要将 MOXy 用作您的 JSON 提供程序,您需要将 jersey-media-moxy 模块添加到您的 pom.xml 文件中:

    <dependency>
       <groupId>org.glassfish.jersey.media</groupId>
       <artifactId>jersey-media-moxy</artifactId>
       <version>2.15</version>
    </dependency>
    

    如果您不使用 Maven,请确保拥有所有需要的依赖项。见jersey-media-moxy dependencies
    您需要将这些 jar 文件添加到您的项目中,以便通过 jersey-media-moxy 支持 json 媒体类型:

    • jersey-media-moxy-2.15.jar
    • org.eclipse.persistence.core-2.5.0-rc2.jar
    • org.eclipse.persistence.antlr-2.5.0.jar
    • org.eclipse.persistence.moxy-2.5.0.jar
    • jersey-entity-filtering-2.3.1.jar

    用法:

    一些普通的类:

    public class MyJAXBBean{
    
       private String name = "jack";
       private int id = 12;
    
       public MyJAXBBean() {
    
       }
    
       public String getName() {
           return this.name;
       }
    
       public void setName(String name) {
           this.name = name;
       }
    
       public int getId() {
           return this.id;
       }
    
       public void setId(int id) {
           this.id = id;
       }
    }
    

    还有一个用于运行球衣客户端示例的主类:

     public static void main(String[] args) {
        //ClientConfig cc = new ClientConfig().register(new JacksonFeature());
        Client client = ClientBuilder.newClient();
        WebTarget target = client.target("http://localhost:8084/myhost/test");
    
        Form form = new Form();
        form.param("x", "foo");
        form.param("y", "bar");
    
        MyJAXBBean bean;
        bean = target.request(MediaType.APPLICATION_JSON_TYPE)
                .post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE),
                        MyJAXBBean.class);
        System.out.println(bean);
    }
    

    服务器的json响应(http://localhost:8084/myhost/test)必须是以下格式:

     {"name":"haleh", "id":3}
    

    【讨论】:

      【解决方案2】:

      通过编写自定义 MessageBodyReader 解决。 https://jersey.java.net/documentation/latest/message-body-workers.html#d0e4072

      【讨论】:

        【解决方案3】:

        我遇到了类似的问题,尝试解组使用媒体类型“application/javascript”提供的 JSON。 我只想为原始答案做出贡献,并举例说明我如何实施建议的解决方案。您可以根据需要更改媒体类型。

        @Provider
        @Consumes("application/javascript")
        public class MyMoxyJSONProvider extends MOXyJsonProvider {
            @Override
            public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
                return mediaType.equals(MediaType.valueOf("application/javascript"));
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2015-03-27
          • 1970-01-01
          • 1970-01-01
          • 2014-06-19
          • 2015-08-11
          • 2015-01-21
          • 1970-01-01
          • 2012-02-03
          • 2023-02-02
          相关资源
          最近更新 更多