使用ObjectMapper添加JAR使我的ObjectMapper不可发现

exp*_*ert 5 java jax-rs jersey swagger jersey-2.0

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

我正在尝试使用Swagger和在Jetty下运行的Jersey 2.问题是,只要我将Swagger JAX-RX jar添加到类路径中,就不会发现我的对象映射器,因此我丢失了对象的自定义序列化.

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

@Provider
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
}
Run Code Online (Sandbox Code Playgroud)

我已经向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;
}
Run Code Online (Sandbox Code Playgroud)

在正确的代码流中_mapperConfig.getConfiguredMapper()返回null,随后导致调用_locateMapperViaProvider找到我的自定义映射器.使用Swagger,它默认为com.fasterxml.jackson.jaxrs.json.JsonMapperConfigurator和我的自定义json序列化器永远不会被调用.

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

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

Pau*_*tha 1

正如 fehguy 在问题报告中指出的那样,使用最新的 Swagger 版本并使用SwaggerSerializers应该可以解决此问题。以前 SwaggerJacksonJsonProvider将用于所有序列化,而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);
    }
Run Code Online (Sandbox Code Playgroud)