当前位置: 首页 > 知识库问答 >
问题:

Spring中Jackson ObjectMapper的生命周期

燕烨
2023-03-14

环境:

我使用的是spring boot版本2.3.3版本

问题

由于我不希望对某些字段进行自定义反序列化,所以我使用ObjectMapper在我的自定义反序列化器中使用convertValue()

我注意到,我不能@autowire在我的任何反序列化器中使用ObjectMapper,或者在我的应用程序中自动连线的其他ObjectMapper将无法获得配置(因此反序列化器没有正确注册)

我正在使用(ObjectMapper)jsonParser.getCodec();在反序列化程序中获取ObjectMapper

但是这个ObjectMapper没有正确配置(这意味着忽略了类/方法上的注释)。

我想反序列化我的对象,如下所示:

@Test
void testDeserializeFoo() throws IOException {
    ObjectMapper om = new ObjectMapper(); // this is obtained by jsonParser in deserializer but it behaves the same, since the ObjectMapper lacks the configuration
    InputStream is = getClass().getResourceAsStream("/json/foo.json");
    JsonNode fooNode = om.readTree(is);
    Foo foo =  om.convertValue(fooNode, Foo.class);
    log.info("Foo: " + foo);
}

Foo的构造函数用@jsonCreator注释。

可能的解决方案/测试:

我测试我的反序列化器是这样的:

private JsonParser getJsonParser(String resource) throws IOException {
        InputStream src = getInputStream(resource);
        return objectMapper.createParser(src);
}
    
@Test
void testDeserializeFoo() throws IOException {
    JsonParser parser = getJsonParser("/json/foo.json");
    Foo foo = deserializer.deserialize(parser, null);
    System.out.println(foo);
}

问题是getParser()方法中的objectMapper始终是一个新实例。现在我使用autowired ObjectMapper。但这又有什么作用呢?

    null

我找了相关的话题,其他答案相关的地方:

  • Spring和Jackson的上下文并不相同(但为什么,这意味着什么?)
  • 您需要一个HandlerInstantiator来自动连接(我假设这在我的spring版本中已经是默认的了,这也不能解释为什么在一个反序列化器中自动连接ObjectMapper时,我的自定义反序列化器不会在没有任何错误消息的情况下被选中)

共有1个答案

章兴发
2023-03-14

通常,您可以使用Jackson2ObjectMapperBuilder和build()生成新的对象映射器实例,并应用所有最近的设置。默认的ObjectMapper由JackonAutoConfiguration中的JackonsObjectMapperConfiguration提供。所有jackson2对象映射器构建器实例都是由JacksonAutoConfiguration中的JacksonObjectMapperBuilderConfiguration创建的。有关配置对象映射器的详细信息可在此处找到

如果您不喜欢JacksonAutoConfiguration中的标准默认值,可以使用Jackson2ObjectMapperBuilderCustomizerConfiguration进一步自定义jackson2对象映射器生成器

检查这个答案--它将回答你的其他问题

 类似资料:
  • 本文向大家介绍spring中bean的生命周期详解,包括了spring中bean的生命周期详解的使用技巧和注意事项,需要的朋友参考一下 1.Spring IOC容器可以管理bean的生命周期,Spring允许在bean生命周期内特定的时间点执行指定的任务。 2.Spring IOC容器对bean的生命周期进行管理的过程: ① 通过构造器或工厂方法创建bean实例 ② 为bean的属性设置值和对其他

  • 要了解Spring事件是否适合我正在处理的任务,我需要了解它们是如何工作的,它们存储在哪里?因为我可以猜测它们存储在Spring应用程序上下文中,如果应用程序崩溃则会消失,我的猜测正确吗?

  • 问题内容: 在Spring下如何适当地完成Hibernate会话的“生命周期”? 该由Spring自动创建并从Glassfish的连接池利用其数据库连接。目前,我正在通过进行Hibernate会话。然后,我开始交易,完成工作,然后或结束。我需要做任何其他操作,如,,在任何时间或任何其他人,以便连接将被适当地返回到游泳池或就是一切已经自动春天呢? 有了很多这样的方法,这让我眼前一亮,无法理解应该何时

  • 首先简单说一下(以下为一个回答的参考模板) 1、实例化一个Bean--也就是我们常说的new; 2、按照Spring上下文对实例化的Bean进行配置--也就是IOC注入; 3、如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值 4、如果这个Bean已经实现了BeanFactoryA

  • 我对Spring的生命周期感到困惑。 上面的代码片段是否创建了对象? 如果上述答案为真。 a) 然后,对于作用域为“singleton”的bean,获取在上述代码片段中创建的对象。我是对还是错? b)对于范围为“原型”的情况,创建的对象是否未使用。因为,容器总是返回新对象。 上面的代码片段是否创建了对象? 如果答案是假的, Spring框架如何验证bean定义是否正确。 根据亨利的回答 通常,单例

  • 注:本文档提供的生命周期指的是 Universal App 的生命周期,它依赖 rax-app 提供的 runApp方法。 App 级生命周期 launch  在 App 启动时触发 使用生命周期 你可以使用 rax-app 提供的 useAppLaunch 来注册 App 级别的生命周期。 示例: import { useAppLaunch } from 'rax-app'; useAppLa