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

时间:2015-02-18 08:47:47

标签: java json jackson

我们有一个基于Spring的应用程序,我们为Jackson ObjectMapper类定义了一个单例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实例执行其他操作的其他线程(可能只是反序列化或序列化)?

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

如果我没有清楚地解释这个问题,我道歉;请告诉我,我可以提供更多详细信息。

1 个答案:

答案 0 :(得分:2)

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

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

在您的情况下,您正在调用实际创建mapper.reader(...)的{​​{1}}方法。 ObjectReaderObjectReader是不可变的,因此它们永远不会更改基础状态。此外,即使您更改基础ObjectWriter的配置,读者也不会受到影响。

请注意,对于ObjectMapper方法的每次调用,您都要创建一个新的mapper.reader(...),因此,如果您在调用ObjectReader方法之间更改ObjectMapper配置,则可以运行陷入困境。

因此,总结一下:如果你创建一个reader并在你的主题中使用相同的阅读器,你就是安全的。