Jackson ObjectMapper - 更改 ObjectReader 上的配置是否会影响多个线程对 ObjectMapper 的使用

Jackson ObjectMapper - does changing configurations on ObjectReader impact usage of ObjectMapper by multiple threads

我们有一个基于 Spring 的应用程序,我们已经为 Jackson ObjectMapper class.

定义了一个单例 bean
@Bean(name = "jacksonObjectMapper")
public ObjectMapper createObjectMapper() {
  return new ObjectMapper();
}

我们有一个用例来编写一个通用的 JSON Serializer/Deserializer 我们按以下方式编写:

public <T, U> T deserialize(final String inputJsonString, final Class<T> targetType, final Class<U> targetParameterType) throws JsonProcessingException, IOException {
  return objectMapper
    .reader(objectMapper.getTypeFactory().constructParametricType(targetType, targetParameterType))
    .without(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
    .readValue(inputJsonString);
}

我在这里使用 ObjectReader 而不是 ObjectMapper 本身,并更改 ObjectReader 上的一些配置(例如 .without(...))。我的问题是,此类配置更改是否会影响可能使用相同 ObjectMapper 实例执行其他操作(可能只是反序列化或序列化)的其他线程?

有人可以帮助我了解细节并指导我吗?

如果我没有把问题解释清楚,我深表歉意;请让我知道,我可以提供更多详细信息。

简短回答:不,ObjectReader配置不会更改基础ObjectMapper配置。

解释: 如果直接使用 ObjectMapper 并更改映射器的配置,如果映射器在多个线程之间共享,则可能会导致问题。但是,如果您不更改底层配置,无论如何您应该是安全的(更多阅读 here)。

在你的例子中,你调用了 mapper.reader(...) 方法,你实际上在其中创建了一个 ObjectReaderObjectReaderObjectWriter 是不可变的,因此它们永远不会改变底层状态。此外,即使您更改基础 ObjectMapper 的配置, reader 也不会受到影响。

请注意,每次调用 mapper.reader(...) 方法都会创建一个新的 ObjectReader,因此如果您在调用 reader 方法之间更改 ObjectMapper 配置,您可能运行成问题。

因此,总结一下:如果您创建一个 ObjectReader 并在您的线程中使用相同的 reader,那么您是安全的。