41

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

もしそうなら、それを構成する方法は?

4

6 に答える 6

62

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

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

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

于 2010-04-05T18:45:13.763 に答える
11

ソリューションJacksonJaxbJsonProvider

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

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

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

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

JacksonJaxbJsonProviderパッケージの欠点とは別にinternal、コードが実行されるジャージーのバージョンを知る必要があることもあります。これは、異なる依存関係が異なるジャージーのバージョンを必要とする場合に問題になる可能性があります。

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

Jerseyクライアントで Jackson を構成する方法としては、Jerseyサーバーでの構成と同じ方法を使用して、次の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 から機能するようです。

于 2018-09-14T19:52:15.760 に答える
4

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

于 2011-08-26T01:09:25.170 に答える
2

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

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

于 2017-09-27T18:11:26.693 に答える
0

jersey 2.22.2および Jackson 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
于 2016-03-08T16:52:12.460 に答える