找不到媒体类型 = 应用程序/八位字节流的 MessageBodyReader用法:

2022-09-04 04:15:14

我正在尝试使用以下代码片段从 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 未找到 media type=application/octet-stream, type=class com.app.weather.providers.org.openweathermap.pojo.WeatherForecast, genericType=class 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>

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


答案 1

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

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

有关更多信息,请阅读球衣文档的第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媒体类型:

  • 泽西-介质-莫西-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
  • 泽西-实体-过滤-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);
}

server() 的 json 响应必须采用以下格式:http://localhost:8084/myhost/test

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

答案 2