以每请求,线程安全的方式设置Jackson DeserializationContext属性

时间:2016-06-10 20:47:23

标签: web-services jackson thread-safety jax-rs jersey-2.0

我希望能够添加请求范围的属性(JAX-RS ContainerRequestContext,因为我宁愿使用Jackson将我的参数转换为对象而不是JAX-RS的病对ParameterConverterProviders构思并笨拙DeserializationContext},以便可以在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的大量,多余的开销,我怎样才能实现这一目标?

1 个答案:

答案 0 :(得分:4)

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

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