2015-02-10 58 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); 
    }