2017-02-27 5 views
1

私はいくつかのAPIを消費して更新するために使用しているクライアントアプリケーションを持っています。私はジャージージャージーとジャージー2.25.1を使用してカスタムコネクタ、基本的なセットアップだけです。実行時にJersey JacksonのMapper設定を更新します。

私はジャクソンとジャージーを使ってシリアル化しているPOJOを持っていますが、このPOJOは2つの方法でシリアル化する必要があります。まず、すべてのヌル値をシリアル化しながら含めます.2つ目はnullフィールドを無視して削除します。

これは、APIが変更されないようにAPIが動作する方法です(私のAPIではありません)。実行時にJersey Jackson Mapperを更新することができますか?あなたはContextResolverを使用して、そこにObjectMapperを設定することができ

Client client = ClientBuilder.newBuilder() 
      .register(JacksonFeature.class) 
      .build(); 
client.getJacksonObjectMapper().setSerializationInclusion(Include.NON_NULL); 

答えて

1

:私は探しています何

は次のようなものです。 Jacksonのプロバイダはコンテキストリゾルバを呼び出すことでObjectMapper

class JacksonResolver implements ContextResolver<ObjectMapper> { 
    private final ObjectMapper mapper = new ObjectMapper(); 

    public JacksonResolver() { 
     // configure mapper 
    } 

    @Override 
    public ObjectMapper resolve(Class<?> cls) { 
     return this.mapper; 
    } 
} 

Client client = ClientBuilder.newBuilder() 
     .register(JacksonFeature.class) 
     .register(new JacksonResolver()) 
     .build(); 
+0

クライアントの作成後にこれを行うことができますか?私は条件付きで実行時に意味ですか? – engma

+0

いいえ、あなたが得ようとしているのは、モデルクラスごとです。シリアライズされるクラスは 'getContext'メソッドに渡されます。そして、あなたは条件付きでそこで使うマッパーを決定できますが、それは本当にそれです。それ以外の場合、マッパーは、そのような設定はスレッドセーフではないため、条件付きで構成することは実際には想定されていません。シナリオごとに異なるクライアントを作成するだけでよいでしょう。 –

+0

ええ、私は別のクライアントを作成する必要があるようです@peeskillet – engma

関連する問題