媒体类型为application/octet-stream的消息主体读取器未找到。

16

我正在尝试使用以下代码片段从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: 找不到用于媒体类型=application/octet-stream、类 com.app.weather.providers.org.openweathermap.pojo.WeatherForecast、 泛型类com.app.weather.providers.org.openweathermap.pojo.WeatherForecast的MessageBodyReader。

pom.xml中的Jersey依赖项:

<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>

这段代码在应用服务器之外运行。谢谢。

3个回答

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

  • MOXy - 通过MOXy进行JSON绑定支持是在Jersey 2.0中支持JSON绑定的默认和首选方式。当类路径上存在JSON MOXy模块时,Jersey会自动发现该模块,并无缝地在您的应用程序中启用通过MOXy进行的JSON绑定支持。(请参见第4.3节“可自动发现的功能”)。
  • Java API for JSON Processing (JSON-P)
  • Jackson
  • Jettison

有关更多信息,请阅读Jersey文档的第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
为了支持通过jersey-media-moxy使用json媒体类型,您需要将这些jar文件添加到您的项目中:
  • 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;
   }
}

以下是运行Jersey客户端示例的主类:

 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);
}

服务器(http://localhost:8084/myhost/test)的JSON响应必须采用以下格式:
 {"name":"haleh", "id":3}

2

2

我有类似的问题,试图解析使用媒体类型“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"));
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接