什麼是澤西的ContextResolver
什麼是Provider
?兩者有什麼區別?我使用Genson和澤西島。當Jersey在類路徑中找到Genson JAR時,Genson會自動註冊。 Genson JAR的WEB-INF/services目錄包含一個名爲「org.glassfish.jersey.internal.spi.AutoDiscoverable」的文件。什麼是Jersey中的ContextResolver和Provider?
此之後AutoDiscoverable
路徑,默認情況下Genson /新澤西自動註冊了以下類:其中較爲混亂進場
@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;
這裏是:看它建議建立像自定義提供了Genson文檔所以:
@Provider
public class GensonProvider implements ContextResolver<Genson> {
private final Genson genson = new GensonBuilder().setSkipNull(true).create();
}
但是該提供商實現ContextResolver
不是MessageBodyReader
/像內部Genson一個作家一樣。有什麼不同?另外,該提供商不會做與默認自動註冊的相同!特別是它忽略 JAXB標籤喜歡@XmlTransient
!挖成GensonJaxRSFeature
的Genson源代碼,我看到Genson對象,像這樣創建:
private static final Genson _defaultGenson = new GensonBuilder()
.withBundle(new JAXBBundle())
.useConstructorWithArguments(true)
.create();
從那個從Genson文檔,我可以看到「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建議定義一個自定義提供者?至少當前的文檔建議使用配置了GensonJaxRSFeature的ResourceConfig,該GensonJaxRSFeature使用您自定義的Genson實例。你不應該改變默認的genson實例。如果你想要另一個配置,只需用你想要的配置創建另一個實例。 – eugen
@eugen看看我的編輯,看看我做了什麼。在Genson文檔中推薦的代碼是「new ResourceConfig()。register(new GensonJaxRSFeature()。use(myCustomGenson).disableSerializationFor(String.class));」。它和我現在正在做的一樣,除了我使用提供者而不是通常放置「新的ResourceConfig」代碼的地方。那個「新的ResourceConfig」通常在哪裏?你能發表一個例子或鏈接嗎? – KyleM
檢查[官方文檔](https://jersey.java.net/documentation/latest/deployment.html#environmenmt.appmodel)關於如何使用ResourceConfig。沒有辦法採取默認的genson實例並修改它。只要提供你自己的配置你想要的。如果您希望Genson使用JAXB註釋,則需要將其配置爲使用此捆綁軟件。 – eugen