【问题标题】:For Jackson, How to safely share an ObjectMapper ? Is there any immutable ObjectMapper?对于 Jackson,如何安全地共享 ObjectMapper ?是否有任何不可变的 ObjectMapper?
【发布时间】:2017-09-23 11:54:52
【问题描述】:

Mapper 实例是完全线程安全的,无需创建一个单独使用的映射器,但可以更改映射器的配置。

虽然 ObjectMapper 有copy 功能可以根据现有映射器复制配置以进行自定义,但如果我共享一个映射器,则不能保证当有人想要自定义映射器时,他们会复制共享的映射器。所以我想要一个不可变的映射器来共享,如果有人不小心更改了共享映射器,应该抛出一些异常。

有这样的吗?

【问题讨论】:

  • 我将创建一个 ObjectMapper 的包装器并公开一些需要的功能
  • 相反,我只是想隐藏一些功能以防止配置更改,这似乎很常见的用例,是否存在任何包装器?如果没有,我会为自己创建一个。
  • 一种选择是共享ObjectWriter 实例而不是ObjectMapper。该类乍一看似乎是不可变的,尽管我认为这不是它的预期目的。
  • @Henrik 但是从 ObjectWriter 无法克隆 ObjectMapper。
  • @wener:你不应该这样做。创建一个正确配置的ObjectMapper,然后将ObjectReaderObjectWriter 的实例提供给您担心有人可能会更改配置的代码部分。有关详细信息,请参阅此答案:stackoverflow.com/a/3909846/13075

标签: java json jackson jackson-databind


【解决方案1】:

一种方法是不共享ObjectMapper 实例,而是正确配置它,然后共享ObjectMapper 创建的ObjectWriterObjectReader 实例。

ObjectMapper om = new ObjectMapper();
// Configure to your needs
om.enable(...);
om.disable(...);

// Distribute these to the parts of the program where you fear configuration changes.
ObjectWriter writer = om.writer();
ObjectReader reader = om.reader();

这似乎也是 Jackson 的开发者青睐的方法:https://stackoverflow.com/a/3909846/13075

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-14
    • 2014-05-06
    • 1970-01-01
    • 2016-09-21
    • 2016-11-03
    • 2020-04-01
    • 2013-09-17
    • 1970-01-01
    相关资源
    最近更新 更多