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

THX*_*138 4 web-services jax-rs thread-safety jackson jersey-2.0

我希望能够添加一个请求范围的属性(一个 JAX-RS,ContainerRequestContext因为我宁愿使用 Jackson 将我的参数转换为对象,而不是 JAX-RS 的构思和笨拙ParameterConverterProviders)到 aDeserializationContext以便它可以从内部获取一个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)
Run Code Online (Sandbox Code Playgroud)

如何在不需要为每个单独的请求线程创建新的 ObjectMapper 的大量多余开销的情况下实现这一点?

小智 6

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

objectMapper.reader().forType(Request.class)
    .withAttribute("key", "value").readValue<Request>("source")
Run Code Online (Sandbox Code Playgroud)