使用ObjectMapper添加JAR会使我的ObjectMapper无法发现

当jar中的依赖项中定义了另一个对象映射器时,如何使对象映射器工作?

我正在尝试将Swagger与在Jetty下运行的Jersey

2一起使用。问题是,一旦我将Swagger JAX-RX

jar添加到类路径中,就没有发现我的对象映射器,因此我失去了对象的自定义序列化。

这是我的对象映射器的定义方式

@Provider

public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {

}

我已将问题发布给Swagger的维护者,您可以在其中阅读详细信息。

在Jersey的内部进行了数小时的调试后,我发现Swagger自己的对象映射器com.wordnik.swagger.jaxrs.json.JacksonJsonProvider调用super.setMapper(commonMapper)将非null值设置为ProviderBase._mapperConfig._mapper。稍后当HTTP请求处理程序尝试序列化我的类调用的实例时,最终出现在ProviderBase.locateMapper其中

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;

}

在正确的代码流中_mapperConfig.getConfiguredMapper()返回null,这随后导致对其进行调用的操作_locateMapperViaProvider找到了我的自定义映射器。使用Swagger时,默认设置为,com.fasterxml.jackson.jaxrs.json.JsonMapperConfigurator并且永远不会调用我的自定义json序列化程序。

我创建了一个小项目,在这里重现了这个问题。

你们会如何建议解决此问题?我可能可以在每个类型的属性上指定反序列化器,TTLocalDate但会污染代码:(

回答:

正如fehguy在问题报告中指出的那样,使用最新的Swagger版本并使用SwaggerSerializers可以解决此问题。而在以前的扬鞭JacksonJsonProvider将用于

所有

serializions,将SwaggerSerializers是只用于Swagger模型对象

public class SwaggerSerializers implements MessageBodyWriter<Swagger> {

@Override

public boolean isWriteable(Class type, Type genericType, Annotation[] annotations,

MediaType mediaType) {

return Swagger.class.isAssignableFrom(type);

}

以上是 使用ObjectMapper添加JAR会使我的ObjectMapper无法发现 的全部内容, 来源链接: utcz.com/qa/407073.html

回到顶部