2016-06-29 56 views
1

什麼是澤西的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); 
    } 
} 
+0

是什麼讓你說Genson建議定義一個自定義提供者?至少當前的文檔建議使用配置了GensonJaxRSFeature的ResourceConfig,該GensonJaxRSFeature使用您自定義的Genson實例。你不應該改變默認的genson實例。如果你想要另一個配置,只需用你想要的配置創建另一個實例。 – eugen

+0

@eugen看看我的編輯,看看我做了什麼。在Genson文檔中推薦的代碼是「new ResourceConfig()。register(new GensonJaxRSFeature()。use(myCustomGenson).disableSerializationFor(String.class));」。它和我現在正在做的一樣,除了我使用提供者而不是通常放置「新的ResourceConfig」代碼的地方。那個「新的ResourceConfig」通常在哪裏?你能發表一個例子或鏈接嗎? – KyleM

+0

檢查[官方文檔](https://jersey.java.net/documentation/latest/deployment.html#environmenmt.appmodel)關於如何使用ResourceConfig。沒有辦法採取默認的genson實例並修改它。只要提供你自己的配置你想要的。如果您希望Genson使用JAXB註釋,則需要將其配置爲使用此捆綁軟件。 – eugen

回答

2

像我們這個世界一樣,對於同樣的問題,有多種解決方案。澤西似乎鼓勵使用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

謝謝,我想我只是在Genson文檔中混淆了B/C,它說它會創建一個「新ResourceConfig()」,但在此解決方案中並非如此。您正在創建一個新的GensonBuilder,但從來沒有新的ResourceConfig()。無論如何,我現在得到它..我主要是確保我沒有錯過與「新的ResourceConfig」片斷重要的東西... – KyleM

+0

不,你不會錯過任何東西。資源配置似乎是澤西希望我們把配置的一部分 - 但你目前的解決方案也很好。是的,這裏我們不創建資源配置,但擴展它。在澤西島的其他一些用戶會實例化它(我認爲這是與碼頭+球衣的情況下)。 – eugen

相關問題