web-dev-qa-db-ja.com

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

Jersey Client APIを使用する場合、JSONデータのシリアライザー/マーシャラーとしてJAXBの代わりにJacksonを使用することは可能ですか?

もしそうなら、それをどのように構成するのですか?

37
Maciej Biłas

OK、私はそれを見つけました、結局それは非常に単純であることがわかりました:

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

JacksonJsonProviderはjackson-jaxrsパッケージに含まれています。

58
Maciej Biłas

外部設定の作成をスキップして、プロバイダーを直接登録できます。

Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class)
18
swist

JacksonJaxbJsonProviderを使用したソリューション

Jerseyクライアントでカスタム構成でジャクソンを使用する一般的な方法は、たとえば次のようにJacksonJaxbJsonProviderを使用することでした

JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider();
provider.setMapper(yourObjectMapper());
Client client = ClientBuilder.newClient(new ClientConfig(provider));

残念ながらJersey 2.26では、JacksonJaxbJsonProviderクラスをcom.fasterxml.jackson.jaxrs:jackson-jaxrs-json-providerアーティファクト(Jackson)からorg.glassfish.jersey.media:jersey-media-json-jacksonアーティファクト(ジャージー)にコピーし、パッケージをcom.fasterxml.jackson.jaxrs.jsonからorg.glassfish.jersey.jackson.internal.jackson.jaxrs.jsonに変更しました。

JacksonJaxbJsonProviderインポートを変更するために必要なだけのこのアプローチを使用することはまだ可能です。

JacksonJaxbJsonProviderinternalパッケージに含まれることとは別に、コードが実行するJerseyのバージョンを知っておく必要があることも、異なる依存関係が異なるJerseyバージョンを必要とする場合に問題になる可能性があることです。

ContextResolver<ObjectMapper>によるより良いソリューション

JerseyclientでJacksonを構成する方法のより良い可能性は、Jerseyserverこれは、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クラスを再利用できます。

このアプローチはJerseyバージョン2.9から機能するようです。

8
Vojta

org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider (jackson-jaxrs 1.6.1)も試してみてください。

4
sparkle

私は同様の問題に遭遇しましたが、私にとって、ここで与えられた提案はどれもうまくいきませんでした。私のために働いたのは、コードの断片の下でした:

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

私はこの記事からこの解決策を使用する手がかりを得ました- http://www.baeldung.com/jersey-jax-rs-client

2
Wand Maker

ジャージの場合2.22.2およびジャクソン2.7.2グラドルの依存関係は次のとおりです。

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
0
Fırat KÜÇÜK