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: メディア タイプ = アプリケーション/オクテット ストリーム、タイプ = クラス com.app.weather.providers.org.openweathermap.pojo.WeatherForecast、genericType = クラス com.app の MessageBodyReader が見つかりません.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>

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

4

3 に答える 3

3

Jersey JSON サポートは一連の拡張モジュールとして提供され、これらの各モジュールには、インスタンス (クライアント/サーバー)Featureに登録する必要がある の実装が含まれています。ConfigurableJSON 処理や JSON から Java へのバインディングをサポートする複数のフレームワークがあります。以下にリストされているモジュールは、個々の JSON フレームワークを Jersey に統合することにより、JSON 表現のサポートを提供します。現在、Jersey は次のモジュールと統合して JSON サポートを提供しています。

  • MOXy - MOXy による JSON バインディングのサポートは、Jersey 2.0 以降、Jersey アプリケーションで JSON バインディングをサポートするためのデフォルトで推奨される方法です。JSON MOXy モジュールがクラスパスにある場合、Jersey はモジュールを自動的に検出し、アプリケーションで MOXy を介して JSON バインディング サポートをシームレスに有効にします。(セクション4.3「自動検出機能」を参照してください。)
  • JSON 処理用 Java API (JSON-P)
  • ジャクソン
  • ジェティソン

詳細については、ジャージのドキュメントの第 9 章を参照してください。

Moxy は、json メディア サポートの提案された方法です。MOXy メディア モジュールは、その機能 (MoxyJsonFeature) をクライアント/サーバーに明示的に登録する必要がないモジュールの 1 つです。 jersey-media-moxy モジュールをクラスパスに追加すると、この機能は自動的に検出および登録されるため、構成可能です。 .

MOXy を JSON プロバイダーとして使用するには、 pom.xml ファイルに jersey-media-moxy モジュールを追加する必要があります。

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

server( ) の json 応答はhttp://localhost:8084/myhost/test、次の形式である必要があります。

 {"name":"haleh", "id":3}
于 2015-02-02T06:47:30.900 に答える