2015-02-10 74 views
4

如何在使用依賴關係在jar中定義另一個對象映射器的情況下如何使對象映射器正常工作?使用ObjectMapper添加JAR使得我的ObjectMapper不可發現

我正在嘗試使用SwaggerJersey 2,它正在Jetty下運行。問題是,只要我將Swagger JAX-RX jar添加到類路徑中,我的對象映射器就沒有被發現,因此我失去了我的對象的自定義序列化。

這裏是我的對象映射如何定義

@Provider 
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> { 
} 

我已經發布了issue招搖的維護者,你可以閱讀細節。

經過幾小時的澤西內部調試後,我發現Swagger自己的對象映射器com.wordnik.swagger.jaxrs.json.JacksonJsonProvider調用super.setMapper(commonMapper),它將非空值設置爲ProviderBase._mapperConfig._mapper。後來,當HTTP請求處理程序試圖序列我類別的呼叫例如在ProviderBase.locateMapper結束了已在正確的代碼流_mapperConfig.getConfiguredMapper()返回空隨後引起_locateMapperViaProvider指找到我的自定義映射器調用以下機身

public MAPPER locateMapper(Class<?> type, MediaType mediaType) 
{ 
    // First: were we configured with a specific instance? 
    MAPPER m = _mapperConfig.getConfiguredMapper(); 
    if (m == null) { 
     // If not, maybe we can get one configured via context? 
     m = _locateMapperViaProvider(type, mediaType); 
     if (m == null) { 
      // If not, let's get the fallback default instance 
      m = _mapperConfig.getDefaultMapper(); 
     } 
    } 
    return m; 
} 

。使用Swagger它默認爲com.fasterxml.jackson.jaxrs.json.JsonMapperConfigurator,我的自定義json序列化程序永遠不會被調用。

我創建了一個再現此問題的小項目here

你們會建議如何解決這個問題?我可以在TTLocalDate類型的每個屬性上指定反序列化器,但它會污染代碼:(

回答

1

正如問題報告中的fehguy所述,使用最新的Swagger版本並使用SwaggerSerializers應該可以解決此問題。揚鞭JacksonJsonProvider將用於所有 serializions的SwaggerSerializersonly used for the Swagger model object

public class SwaggerSerializers implements MessageBodyWriter<Swagger> { 

    @Override 
    public boolean isWriteable(Class type, Type genericType, Annotation[] annotations, 
           MediaType mediaType) { 
     return Swagger.class.isAssignableFrom(type); 
    } 
相關問題