ジャージーの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);
}
}
Gensonがカスタムプロバイダを定義することをお勧めしますか?少なくとも現在のドキュメントでは、カスタムGensonインスタンスを使用するGensonJaxRSFeatureで構成されたResourceConfigの使用を推奨しています。デフォルトのgensonインスタンスを変更する必要はありません。別の設定が必要な場合は、必要な設定で別のインスタンスを作成してください。 – eugen
@eugen私の編集を見て、私が何をしたかを見てください。 Gensonのドキュメントで推奨されるコードは、 "new ResourceConfig()。register(new GensonJaxRSFeature()。use(myCustomGenson).disableSerializationFor(String.class));"です。これは、通常は「新しいResourceConfig」コードを置くのではなく、私がプロバイダを使用していることを除いて、今やっていることと同じです。 「新しいResourceConfig」は通常どこに行きますか?あなたは例やリンクを投稿できますか? – KyleM
ResourceConfigの使用方法については、[公式ドキュメント](https://jersey.java.net/documentation/latest/deployment.html#environmenmt.appmodel)を確認してください。デフォルトのgensonインスタンスを取得して変更する方法はありません。あなたが望む設定であなた自身のものを提供してください。 Gensonにこのバンドルを使用するように設定するために必要なJAXBアノテーションを使用させたい場合は、そうです。 – eugen