我使用 Jersey 2.9 和 Jackson 2.5.1 在 RESTful API 上生成 JSON 响应。
为了提供自定义ObjectMapper
,我实现了一个ContextResolver
,如下所示:
@Provider
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
@Context UriInfo uriInfo;
private final ObjectMapper objectMapper;
public ObjectMapperProvider() {
objectMapper = new ObjectMapper();
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
objectMapper.enable(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS);
}
@Override
public ObjectMapper getContext(Class<?> type) {
// TODO: configure custom object mapper depending on query string params
return objectMapper;
}
}
第一次访问端点时效果很好:调用 getContext
方法,并根据用户提供的查询字符串在对象映射器上执行自定义配置(可能返回一个新配置) .
但是,一旦端点被访问一次,Jersey 似乎会缓存该对象映射器,并且永远不会再次调用 getContext
来请求它。我需要禁用或阻止此行为,因为查询字符串可能已更改,并且我可能需要为该请求返回不同的对象映射器。
这可能吗?
谢谢!!
最佳答案
请注意,创建对象映射器的成本相对较高。它是线程安全的并且 designed to be reused 。因此,您可以考虑自定义the Jackson JAX-RS provider,而不是创建自己的上下文。每个请求,无需创建新的映射器实例。
有几种方法可以实现这一目标。
您可以使用 the Jackson specific annotations 注释您的资源方法。示例:
@JacksonFeatures(serializationEnable
= { SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS })
public void foo() {}
但这不允许将请求参数传递给对象映射器。
另一个选项是创建 ObjectWriterModifier/ObjectReaderModifier 的实例并通过 ObjectWriterInjector/ObjectReaderInjector 通过线程本地注入(inject)注册它。请参阅example .
您还可以尝试组合 per-request scope context provider以及线程本地修改。
关于java - 禁用 Jersey 的 ObjectMapper 缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24445096/