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(...)
方法,你实际上在其中创建了一个 ObjectReader
。 ObjectReader
和 ObjectWriter
是不可变的,因此它们永远不会改变底层状态。此外,即使您更改基础 ObjectMapper
的配置, reader 也不会受到影响。
请注意,每次调用 mapper.reader(...)
方法都会创建一个新的 ObjectReader
,因此如果您在调用 reader
方法之间更改 ObjectMapper
配置,您可能运行成问题。
因此,总结一下:如果您创建一个 ObjectReader
并在您的线程中使用相同的 reader,那么您是安全的。
我们有一个基于 Spring 的应用程序,我们已经为 Jackson ObjectMapper
class.
@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(...)
方法,你实际上在其中创建了一个 ObjectReader
。 ObjectReader
和 ObjectWriter
是不可变的,因此它们永远不会改变底层状态。此外,即使您更改基础 ObjectMapper
的配置, reader 也不会受到影响。
请注意,每次调用 mapper.reader(...)
方法都会创建一个新的 ObjectReader
,因此如果您在调用 reader
方法之间更改 ObjectMapper
配置,您可能运行成问题。
因此,总结一下:如果您创建一个 ObjectReader
并在您的线程中使用相同的 reader,那么您是安全的。