【问题标题】:Adding JAR with ObjectMapper makes my ObjectMapper non-discoverable使用 ObjectMapper 添加 JAR 使我的 ObjectMapper 不可发现
【发布时间】:2015-02-10 12:16:24
【问题描述】:

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

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

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

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

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

在 Jersey 内部进行数小时调试后,我发现 Swagger 自己的对象映射器 com.wordnik.swagger.jaxrs.json.JacksonJsonProvider 调用 super.setMapper(commonMapper) 将非空值设置为 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 序列化程序永远不会被调用。

我创建了一个小项目来重现这个问题here

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

【问题讨论】:

    标签: java jersey jax-rs jersey-2.0 swagger


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-01-18
      • 2020-01-12
      • 1970-01-01
      • 2018-11-09
      • 2016-06-12
      • 1970-01-01
      • 2017-08-24
      • 2018-07-09
      • 1970-01-01
      相关资源
      最近更新 更多