我们有一个基于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
实例执行其他操作的其他线程(可能只是反序列化或序列化)?
有人可以帮我理解细节并指导我吗?
如果我没有清楚地解释这个问题,我道歉;请告诉我,我可以提供更多详细信息。
答案 0 :(得分:2)
简答:不,ObjectReader
配置不会更改基础ObjectMapper
配置。
说明:如果直接使用ObjectMapper
并更改映射器的配置,如果映射器在多个线程之间共享,则可能会导致问题。但是,如果您不更改基础配置,则无论如何都应该是安全的(更多阅读here)。
在您的情况下,您正在调用实际创建mapper.reader(...)
的{{1}}方法。 ObjectReader
和ObjectReader
是不可变的,因此它们永远不会更改基础状态。此外,即使您更改基础ObjectWriter
的配置,读者也不会受到影响。
请注意,对于ObjectMapper
方法的每次调用,您都要创建一个新的mapper.reader(...)
,因此,如果您在调用ObjectReader
方法之间更改ObjectMapper
配置,则可以运行陷入困境。
因此,总结一下:如果你创建一个reader
并在你的主题中使用相同的阅读器,你就是安全的。