java - 禁用 Jersey 的 ObjectMapper 缓存?

标签 java rest caching jackson jersey-2.0

我使用 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/

相关文章:

java - 将图像加载到 JPanel 不起作用

java - ImageIcon 不显示在左上角的应用程序窗口中

java - 如何在 Liferay Dev Studio 中使用 Jax-rs 后端创建 Rest API?

rest - 从 EJB 模块将 EJB 公开为 JAX-RS

php - Node.js 作为程序运行 vs php

javascript - 从缓存中清除 JavaScript 代码

java - 如何知道 Open Office Java API 中的属性值

java - 在 Java 中扩展接口(interface)如何合法?

rest - Domino 数据服务 REST 请求不断给出错误 404

PHP PDO 缓存