2013-05-04 13 views
11

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

私はObjectMapperの新しいインスタンスを作成することができます知っているが、私は私にそれを使用しているものへの参照を与えるためにジャージーのクライアントを要求することを好みます。これどうやってするの? Jersey 2.0はJacksonのことを認識しています。なぜなら、JacksonFeatureクラスが含まれているからです.JacksonFeatureクラスは、Jacksonの機能を最初に設定するために使用されます。

答えて

18

:第二宣言がジュースを必要としないこと

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); 

注設定するtはFAIL_ON_UNKNOWN_PROPERTIESまたはFAIL_ON_EMPTY_BEANSです。私は他の理由でobject_mapperを使用しています。

+0

あなただけがclient''から 'objectMapper'を抽出できるか' client'を、持っている場合は? – DerekY

+0

@DerekY私はそれを行う方法がわかりません。 – necromancer

17

ジャージーは、実際には、明示的に順番にデフォルトのマッパーのインスタンスを使用していますJacksonJsonProviderに、むしろそれデリゲートをObjectMapperインスタンスを設定しません。 the JacksonProviderProxy codeをたどって、その動作を確認できます。あなたはcontext resolverを定義することで、アプリケーション全体で使用する共有マッパーを作成し、カスタマイズすることができます。

@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; 
    } 
} 

ジャクソン・プロバイダーは、このリゾルバからそのマッパーのインスタンスを取得します、とあなたはそうと、あなたのコードで同じことを行うことができます:私は、次の静的メンバを追加することによりこれを解決

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

    public void someResourceMethod() { 
     final ObjectMapper mapper = mapperResolver.getContext(Object.class); 
    } 
} 
+0

はあなたに感謝します。どのようにこれはコードの私の3本のラインと比較ん: 'プライベート静的JacksonJsonProvider ...'(読みやすいではないので、私は答えとして、それを追加したコメントとして) – necromancer

+2

をも、かしら依存性の注入を見ジャージクライアントのためのあなたの方法で作業?またはジャージーサーバーのみ? – necromancer

+1

@necromancer 'クライアントクライアント= ClientBuilder.newClient(); client.register(ObjectMapperContextResolver.class); ' – Martin

0

は、ここで他のソリューション(ジャクソン2.8.3を使用して)に基づいて、それを設定するには、ジャージーオブジェクトマッパーを取得することができませんでした。 (私はそれがosgiコンテナに関連している可能性があると思うが、それにもかかわらず...)その周囲には、ClientからResponseオブジェクトを取得して、それにObjectMapperの独自のインスタンスを呼び出すしかない。その場合、同じインスタンスは明示的な構成で再利用することもできます。

Client client = ClientBuilder.newClient(); 
ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
... 
Response r = client.target(URL).request().get(); 
MyDtoClass dto = mapper.readValue((InputStream)(r.getEntity()), MyDtoClass.class); 
関連する問題