2016-06-29 8 views
1

ジャージーのContextResolverとは何ですか?Providerは何ですか?両者の違いは何ですか?私はジャージーとジェンソンを使用しています。ジェンソンがクラスパスでジェンソンJARを見つけると、Gensonは自動登録されます。 Genson JARのWEB-INF/servicesディレクトリには、 "org.glassfish.jersey.internal.spi.AutoDiscoverable"というファイルが含まれています。より多くの混乱の出番JerseyのContextResolverおよびProviderとは何ですか?

@Provider 
@Consumes({MediaType.APPLICATION_JSON, "text/json", "application/*+json"}) 
@Produces({MediaType.APPLICATION_JSON, "text/json", "application/*+json"}) 
public class GensonJsonConverter implements MessageBodyReader<Object>, MessageBodyWriter<Object> { 

    private final ContextResolver<GensonJaxRSFeature> _gensonResolver; 

がここにあります:

AutoDiscoverableパスは、デフォルトでGenson /ジャージーには、以下のクラスを自動登録することに続いて、それはのようなカスタムプロバイダを作成することをお勧めしますGensonのドキュメントを見てそう:

@Provider 
    public class GensonProvider implements ContextResolver<Genson> { 
    private final Genson genson = new GensonBuilder().setSkipNull(true).create(); 
    } 

はしかし、そのプロバイダは、内部GensonのようなContextResolverないMessageBodyReader /ライターが行う実装しています。違いは何ですか?また、そのプロバイダはを実行しませんデフォルトの自動登録されたものと同じものがあります!特に、は、@XmlTransientのような JAXBタグを無視します。 GensonJaxRSFeature用Gensonのソースコードに掘り、私はGensonオブジェクトがそうのように作成されていることを参照してください。それから、私は見ることができますGensonドキュメントから

private static final Genson _defaultGenson = new GensonBuilder() 
     .withBundle(new JAXBBundle()) 
     .useConstructorWithArguments(true) 
     .create(); 

「JAXBBundleは」注意を払うようにGensonの原因はおそらく何であることJAXBアノテーションに追加します。

主な問題:

私はジャージで自動登録され、デフォルトGenson JSONプロバイダーを使用したいが、私はそれにいくつかのカスタムプロパティを設定します。私が言ったように、私がカスタムプロバイダを登録するとき、それはデフォルトのGensonを使用しません!


更新:

これは私が今やっていることですし、それが動作します。しかし、以下の@eugenのソリューションは、Genson推奨ソリューションです。

@Provider 
public class GensonProvider implements ContextResolver<GensonJaxRSFeature> { 
    private final GensonJaxRSFeature _gensonResolver = new GensonJaxRSFeature(); 

    private static final Genson _defaultGenson = new GensonBuilder() 
       .withBundle(new JAXBBundle()) 
       .useConstructorWithArguments(true) 
       .setSkipNull(true) 
       .create(); 

    @Override 
    public GensonJaxRSFeature getContext(Class<?> type) { 
     return _gensonResolver.use(_defaultGenson); 
    } 
} 
+0

Gensonがカスタムプロバイダを定義することをお勧めしますか?少なくとも現在のドキュメントでは、カスタムGensonインスタンスを使用するGensonJaxRSFeatureで構成されたResourceConfigの使用を推奨しています。デフォルトのgensonインスタンスを変更する必要はありません。別の設定が必要な場合は、必要な設定で別のインスタンスを作成してください。 – eugen

+0

@eugen私の編集を見て、私が何をしたかを見てください。 Gensonのドキュメントで推奨されるコードは、 "new ResourceConfig()。register(new GensonJaxRSFeature()。use(myCustomGenson).disableSerializationFor(String.class));"です。これは、通常は「新しいResourceConfig」コードを置くのではなく、私がプロバイダを使用していることを除いて、今やっていることと同じです。 「新しいResourceConfig」は通常どこに行きますか?あなたは例やリンクを投稿できますか? – KyleM

+0

ResourceConfigの使用方法については、[公式ドキュメント](https://jersey.java.net/documentation/latest/deployment.html#environmenmt.appmodel)を確認してください。デフォルトのgensonインスタンスを取得して変更する方法はありません。あなたが望む設定であなた自身のものを提供してください。 Gensonにこのバンドルを使用するように設定するために必要なJAXBアノテーションを使用させたい場合は、そうです。 – eugen

答えて

2

私たちの世界では同じ問題が常に同じように複数の解決策があります。 Jerseyは、カスタムプロバイダを定義する代わりに、ResourceConfigの使用を推奨しているようです。これは、リソース設定(ジャージードキュメントhereとGensonドキュメントhere)を使用して達成する方法です。

public class MyApplication extends ResourceConfig { 
    public MyApplication() { 
     Genson genson = new GensonBuilder() 
       .withBundle(new JAXBBundle()) 
       .useConstructorWithArguments(true) 
       .setSkipNull(true) 
       .create(); 

     register(new GensonJaxRSFeature().use(genson)); 
    } 
} 

もちろん、プロバイダーとのやり取りはうまくいきます。

+0

ありがとう、私はちょうど、このソリューションのケースではない "新しいResourceConfig()"を作成すると言うGensonのドキュメントでb/cを混乱させていたと思います。新しいGensonBuilderを作成していますが、新しいResourceConfig()を作成することはありません。とにかく、私は今それを取得します。私は主に、 "新しいResourceConfig"ピースで重要な何かを逃していないことを確認していました... – KyleM

+0

あなたは何も見逃しません。リソース設定は、ジャージーが私たちに設定部分を置くことを望んでいる場所のようですが、あなたの現在の解決策も問題ありません。ええ、ここではリソース設定を作成するのではなく、それを拡張します。 Jerseyの他の用途では、人々はそれをインスタンス化します(私はそれが桟橋+ジャージーの場合だと思います)。 – eugen

関連する問題