【问题标题】:Create clone of jackson ObjectMapper Instance创建杰克逊 ObjectMapper 实例的克隆
【发布时间】:2019-10-25 11:55:10
【问题描述】:

我正在编写一个需要 com.fasterxml.jackson.databind.ObjectMapper 实例的库。库的用户应该能够为 ObjectMapper 或 ObjectMapper 实例本身提供配置。但我也在不影响用户 ObjectMapper 实例的情况下添加/修改了序列化程序的一些设置。

有没有办法创建 ObjectMapper 实例的副本/克隆?

看起来ObjectMapper clonedInstance = new ObjectMapper(originalMapper.getFactory()) 可以工作。但我不确定我是否缺少任何东西。 ObjectMapper 的行为会和原来的完全一样吗?

目前这是我的代码:

public MyLibraryClass {
    private ObjectMapper internalMapper;

    public MyLibraryClass(ObjectMapper mapper) {
        if (mapper == null) {
            internalMapper = new ObjectMapper();
        } else {
            internalMapper = new ObjectMapper(mapper.getFactory());
        }
    }
}

【问题讨论】:

  • class YourMapper extends ObjectMapper 并编写自己的功能
  • ObjectMapper 的 .copy() 方法提供了您要求的功能。
  • 但这不是我想要的。我希望有人可以提供现有的 ObjectMapper,并且我想对其进行修改(例如添加 objectMapper.setAnnotationIntrospector(...))。我不是在问如何扩展 ObjectMapper。我在问如何创建现有实例的克隆
  • @groovedigga 谢谢!不知怎的,我没有看到这个
  • @Raman:很高兴我能帮上忙。请为对您的问题添加有用内容的 cmets 投票。

标签: java jackson


【解决方案1】:

你可以使用ObjectMapper#copy():

copy

public ObjectMapper copy()

创建具有相同初始值的新ObjectMapper 实例的方法 配置为本实例。请注意,这还需要制作一个 底层JsonFactory 实例的副本。

方法通常用于多个不同配置的映射器 是需要的。尽管配置是共享的,缓存的序列化器和 解串器不共享,这意味着新实例可能是 使用前重新配置;意味着它的行为方式与 if 相同 一个实例是从头开始构建的。

因为: 2.1

例子:

public MyLibraryClass {
    private ObjectMapper internalMapper;
    public MyLibraryClass(ObjectMapper mapper) {
        if (mapper == null) {
            internalMapper = new ObjectMapper();
        } else {
            internalMapper = mapper.copy();
        }
    }
}

另请参阅ObjectMapper class javadocs 中的此观察:

(...) 方法copy() 创建具有特定映射器的克隆 配置,并允许在之前配置复制的实例 它被使用了。请注意,copy() 操作与 构造一个新的ObjectMapper 实例:如果可能,你应该 如果您打算将它们用于多个,仍然池和重用映射器 操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 2021-01-09
    • 1970-01-01
    • 2023-04-02
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多