ジャージークライアント・シリアライザとしてジャクソンを使用します

StackOverflow https://stackoverflow.com/questions/2488166

  •  21-09-2019
  •  | 
  •  

質問

これはジャージークライアントAPIを使用した場合の代わりにJAXBのJSONデータのシリアライザ/マーシャラーとしてジャクソンを使用することは可能ですか?

それを設定する方法もしそうなら?

役に立ちましたか?

解決

OK、私は、それは非常に簡単であることが判明し、それを見つけた、すべての後に:

ClientConfig cc = new DefaultClientConfig();
cc.getClasses().add(JacksonJsonProvider.class);
Client clientWithJacksonSerializer = Client.create(cc);

JacksonJsonProviderはジャクソンjaxrsパッケージから来ています。

他のヒント

あなたは、外部設定の作成をスキップし、直接プロバイダを登録することができます:

Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class)
JacksonJaxbJsonProvider

ソリューション

ジャージークライアントのカスタム設定でジャクソンを使用する方法の一般的な方法は、この

のような例えばJacksonJaxbJsonProviderを使用していました
JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider();
provider.setMapper(yourObjectMapper());
Client client = ClientBuilder.newClient(new ClientConfig(provider));

残念ながら中のジャージー2.26 の彼らコピーJacksonJaxbJsonProviderクラス com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-providerアーティファクト(ジャクソン)から org.glassfish.jersey.media:jersey-media-json-jacksonアーティファクトに(ジャージー) パッケージを変更 com.fasterxml.jackson.jaxrs.jsonから org.glassfish.jersey.jackson.internal.jackson.jaxrs.jsonへ。

これは、それがちょうど変更JacksonJaxbJsonProviderのインポートに必要なのは、このアプローチを使用することも可能です。

別にJacksonJaxbJsonProviderinternalパッケージ欠点になりましたことからもあります あなたは別の依存関係が異なるジャージーのバージョンが必要な問題がある可能性がありますあなたのコードが実行ジャージー版れている知っていなければならないということ。

ContextResolver<ObjectMapper>

よりよい解決策

ジャージーでジャクソンを設定するには、どのようにより良い可能性のクライアントのそれはジャージーのサーバーの中に設定されている方法と同じ方法を使用することです。このようなObjectMapperプロバイダを作成することである。

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {

    private ObjectMapper objectMapper = yourObjectMapper();

    @Override
    public ObjectMapper getContext(Class<?> objectType) {
        return objectMapper;
    }

}

このような例のためにそれを使用します:

ClientConfig clientConfig = new ClientConfig();
clientConfig.register(JacksonFeature.class);  // usually auto-discovered
clientConfig.register(new ObjectMapperProvider());
Client client = ClientBuilder.newClient(clientConfig);

あなたは、サーバーとクライアントの両方を持っている場合は、ObjectMapperProviderクラスを再利用することができます。

これは、このアプローチはジャージーバージョン2.9からの作品と思われます。

またorg.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider (jackson-jaxrs 1.6.1)をしようとする場合があります。

私は同様の問題に遭遇したが、私のために、ここで与えられた提案のどれも働きました。 どのような私のために働いたことは、コードの一部を下回っていた。

import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Client;
...

ClientBuilder clientBuilder = ClientBuilder.newBuilder()
clientBuilder.register(JacksonFeature.class);
...
Client client = clientBuilder.build();

キーの変更がJacksonFeature.classの利用だった - それはjersey-media-json-jackson-x.yy.jarから来ている。

// WWW: HTTP -

私はこの記事からこのソリューションを使用する手がかりを得ました。 baeldung.com/jersey-jax-rs-clientする

ジャージの場合の2.22.2のジャクソンの 2.7.2 のGradleの依存関係があります:

dependencies {
    compile("com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.7.2")
    compile("org.glassfish.jersey.core:jersey-client:2.22.2")
}

サンプルクライアントコードがあります:

final String    name    = "world";
final Client    client  = ClientBuilder.newClient().register(JacksonJaxbJsonProvider.class);
final WebTarget target  = client.target("http://localhost:8080").path("hello").path(name);
final Message   message = target.request().get(Message.class);

System.out.println(message.getWelcomeMessage()); // hello world
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top