web-dev-qa-db-ja.com

メディアタイプ= application / octet-streamのMessageBodyReaderが見つかりません

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:Media type = application/octet-stream、type = class com.app.weather.providers.org.openweathermap.pojo.WeatherForecast、genericType = class com.appのMessageBodyReaderが見つかりません.weather.providers.org.openweathermap.pojo.WeatherForecast。

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>

このコードは、アプリケーションサーバーの外部で実行されます。ありがとう。

14
user2966560

Jersey JSONサポートは、これらの各モジュールにFeatureインスタンス(クライアント/サーバー)に登録する必要があるConfigurableの実装が含まれる拡張モジュールのセットとして提供されます。 JSON処理やJSON-to-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メディアモジュールは、jersey-media-moxyモジュールをクラスパスに追加すると自動的に検出および登録されるため、クライアント/サーバーにその機能(MoxyJsonFeature)を明示的に登録する必要がないモジュールの1つです。 。

JSONプロバイダーとしてMOXyを使用するには、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の依存関係 を参照してください。
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;
   }
}

そして、ジャージクライアントのサンプルを実行するためのメインクラス:

 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}
3
Dariush Jafari

カスタムMessageBodyReaderを作成することで解決しました。 https://jersey.Java.net/documentation/latest/message-body-workers.html#d0e4072

2
user2966560

同様の問題が発生しました。メディアタイプ「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"));
    }
}
2
Gio