Web services 以线程安全的方式按请求设置Jackson反序列化上下文属性

Web services 以线程安全的方式按请求设置Jackson反序列化上下文属性,web-services,jackson,thread-safety,jax-rs,jersey-2.0,Web Services,Jackson,Thread Safety,Jax Rs,Jersey 2.0,我希望能够将一个请求范围的属性(一个JAX-RS,因为我宁愿使用Jackson将我的参数转换为对象,而不是JAX-RS的构思不周且笨重的ParameterConverterProviders)添加到反序列化上下文,这样就可以从JsonDeserializer中获得它。我必须调用convertValue(),而不是简单地调用readValue()(不处理实际的JSON),因此我无法在每个线程中创建ObjectReader,除非我愿意先将映射序列化为JSON字符串,然后再将其读回,这将是非常低效的

我希望能够将一个请求范围的属性(一个JAX-RS,因为我宁愿使用Jackson将我的参数转换为对象,而不是JAX-RS的构思不周且笨重的
ParameterConverterProviders
)添加到
反序列化上下文
,这样就可以从
JsonDeserializer
中获得它。我必须调用
convertValue()
,而不是简单地调用
readValue()
(不处理实际的JSON),因此我无法在每个线程中创建
ObjectReader
,除非我愿意先将映射序列化为JSON字符串,然后再将其读回,这将是非常低效的

我希望能够以每个请求的方式完成以下任务:

ObjectMapper om = new ObjectMapper();

//in request-scoped context:
om.getDeserializationContext().setAttribute("requestContext",containerRequestContext)
Map<String,Object> mapOfRequestParameters = ...

BeanOfVastImportance bean = om.convertValue(mapOfRequestParameters,BeanOfVastImportance.class)
ObjectMapper om=new ObjectMapper();
//在请求范围的上下文中:
om.getDeserializationContext().setAttribute(“requestContext”,containerRequestContext)
mapOfRequestParameters=。。。
BeanOfVastImportance bean=om.convertValue(mapOfRequestParameters,BeanOfVastImportance.class)

如何在不需要为每个请求线程创建新的ObjectMapper的情况下实现这一点呢?

这可以通过以下方式轻松实现:


objectMapper.reader().forType(Request.class).withAttribute(“key”、“value”).readValue(“source”)

配置映射器是不安全的。你能根据所有可能的配置创建一定数量的映射器,然后查找你需要的映射器吗?这在技术上是可行的,但基本上会消除Jackson的便利性。我真的只需要能够在不可变的ObjectReader上调用convertValue(可以设置上下文属性),但这在目前是不可能的,所以我需要一个解决方案来完成同样的事情。创建一个新的ObjectReader会有一些开销,但它会保留相同的引用(除了您正在自定义的引用),因此它占用的空间非常小,而且由于它绑定到请求,所以它的生命周期非常短。如果您试图传递的上下文特定于每个请求,那么这看起来是正确的解决方案。