关于Java:使用ObjectMapper添加JAR会使我的ObjectMapper无法发现

Adding JAR with ObjectMapper makes my ObjectMapper non-discoverable

在jar中从依赖项定义了另一个对象映射器的情况下,如何使我的对象映射器工作?

我正在尝试将Swagger与在Jetty下运行的Jersey 2一起使用。问题是,一旦我将Swagger JAX-RX jar添加到类路径中,就没有发现我的对象映射器,因此我失去了对象的自定义序列化。

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

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

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

在Jersey的内部进行了数小时的调试后,我发现Swagger自己的对象映射器com.wordnik.swagger.jaxrs.json.JacksonJsonProvider调用了将非空值设置为ProviderBase._mapperConfig._mappersuper.setMapper(commonMapper)。稍后,当HTTP请求处理程序尝试序列化我的类调用的实例时,结果出现在ProviderBase.locateMapper中,该消息具有以下主体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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应该可以解决此问题。以前将Swagger JacksonJsonProvider用于所有序列化,而SwaggerSerializers仅用于Swagger模型对象

1
2
3
4
5
6
7
public class SwaggerSerializers implements MessageBodyWriter<Swagger> {

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