12

Jersey JAX-RS クライアント (バージョン 2.0) を使用しています。JSON の生成と解析に Jackson ObjectMapper を使用していることはわかっています。同じオブジェクトを使用して、いくつかの Java クラスの JSON を生成し、それらをログに書き込めるようにしたいと考えています。

ObjectMapper の新しいインスタンスを作成できることはわかっていますが、Jersey Client に要求して、使用しているインスタンスへの参照を提供することを好みます。これどうやってするの?Jersey 2.0 は、最初に Jackson 機能を構成するために使用される JacksonFeature クラスが含まれているため、Jackson を認識しています。

4

3 に答える 3

21

次の静的メンバーを追加してこれを解決しました。

private static JacksonJsonProvider jackson_json_provider = new JacksonJaxbJsonProvider()
      .configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false)
      .configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

private static ObjectMapper object_mapper = jackson_json_provider.locateMapper(
      Object.class, MediaType.APPLICATION_JSON_TYPE);

private static Client client = ClientBuilder.newClient().register(jackson_json_provider);

FAIL_ON_UNKNOWN_PROPERTIES2 番目の宣言は、 orを構成するためだけに必要ではないことに注意してくださいFAIL_ON_EMPTY_BEANS。私はobject_mapper他のいくつかの理由で使用します。

于 2013-05-05T23:39:08.427 に答える
17

Jersey は、実際には ObjectMapper インスタンスを明示的に構成するのではなく、代わりにJacksonJsonProviderデフォルトのマッパー インスタンスを使用する に委譲します。JacksonProviderProxy コードをトレースして、その動作を確認できます。コンテキスト リゾルバーを定義することで、アプリケーション全体で使用される共有マッパーを作成およびカスタマイズできます。

@Provider
public class ObjectMapperContextResolver implements
        ContextResolver<ObjectMapper> {
    private ObjectMapper mapper = null;

    public ObjectMapperContextResolver() {
        super();

        // Illustrate configuration of the mapper instance
        mapper = new ObjectMapper().configure(
                SerializationConfig.Feature.WRAP_ROOT_VALUE, true).configure(
                DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true);
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        return mapper;
    }
}

Jackson プロバイダーは、このリゾルバーからマッパー インスタンスを取得します。次のように、コードで同じことを行うことができます。

public class MyResource {
    @Context
    private ContextResolver<ObjectMapper> mapperResolver;

    public void someResourceMethod() {
        final ObjectMapper mapper = mapperResolver.getContext(Object.class);
    }
}
于 2013-05-05T12:48:30.463 に答える