当前位置: 首页 > 面试题库 >

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

谢涵亮
2023-03-14
问题内容

当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);
    }


 类似资料:
  • 当jar中有另一个对象映射器从依赖项定义时,我如何使我的对象映射器工作? 我试图用泽西2号在码头下运行时的霸气。问题是,一旦我将Swagger JAX-RX jar添加到类路径中,我的对象映射器就没有被发现,因此我丢失了对象的自定义序列化。 我已经将问题发布给了Swagger的维护者,在那里你可以阅读详细信息。 在Jersey内部调试了几个小时后,我发现Swagger自己的对象映射器com.wor

  • JSONMappingException:无法从JSON整数实例化类型[simple type,class AuthenticateUser]的值;在com.fasterxml.jackson.databind.deser.std.stdvalueinstantiator.createfromint(stdvalueinstantiator.java:316)在com.fasterxml.jack

  • 我试图从AsyncTask线程中的ObjectMapper获取一个JSON格式的字符串,并且我一直在获取OutOfMemoryError并且在清单文件中已经添加了行 在DoInBackground中执行的AsyncTask方法: Fiscalizacao类: Stacktrace到im存在的问题:

  • 介绍 (Introduction) ObjectMapper是Jackson库的主要actor类。 ObjectMapper类ObjectMapper提供了从基本POJO(普通旧Java对象)或从通用JSON树模型(JsonNode)读取和写入JSON的功能,以及执行转换的相关功能。 它还可以高度自定义,可以使用不同样式的JSON内容,并支持更高级的Object概念,如多态和对象标识。 Objec

  • ObjectMapper 是使用 Swift 编写的框架,能帮助你转换 Model 对象成为 JSON,反之亦然。

  • 我使用的是 Jackson 2.9.6。我有一个控制器,我正在尝试在其中发送可选字段作为我的字段之一。当我收到来自控制器的响应时,我总是以这种格式(如本问题所示)获得它。 基本上,我有一个RestTemplate bean,配置如下: 我想添加Jdk8Module作为序列化过程的一部分。我注意到有一个<code>MappingJackson2HttpMessageConverter(ObjectM