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

标签 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 的大量多余开销的情况下实现这一点?

最佳答案

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

objectMapper.reader().forType(Request.class)
    .withAttribute("key", "value").readValue<Request>("source")

关于web-services - 以每个请求、线程安全的方式设置 Jackson DeserializationContext 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37756939/

相关文章:

asp.net - 如何在 ASP.Net Web 窗体应用程序中从 Jquery 安全地调用用于内部目的的 Web 服务 (.asmx)?

c# - CLR 函数不会返回超过 4000 个字符

.net - 为什么我的WCF服务返回10次调用后超时的FaultException?

java - Jackson 在序列化期间添加不存在的字段

c++ - std::chrono::time_point线程安全吗?

web-services - REST Web 服务 - 动态查询参数

java - 如何使用@JsonProperty反序列化JSON响应?

java - Spring boot 检查 Dto 格式有两种模式

Java线程设计

java - 多线程 ThreadSeven 扩展了 Thread