如何让Spring缓存存储ResponseBody而不是中间对象

已标记

我将spring cache与该方法结合使用,该方法将查询的值返回为JSON:

@RequestMapping("/getById")
@ResponseBody
@Cacheable
public HugeValue getHugeValueFromSlowFoo( @RequestParam(value = "id", defaultValue = "") String id ) {
  return Foo.getById( id );
}

这可以正常工作,并且HugeValue对象存储在缓存中(在这种情况下为Hazelcast)。我想进一步改善这一点,因为从HugeValue创建JSON所花费的时间非常长。我可以告诉spring缓存来缓存我对象的JSON化版本吗?

我将Jackson与Spring Boot 1.2和Spring 4.1一起使用

本·斯坦纳特

在没有真正知道您的确切用例的情况下(不幸的是,我还不允许添加评论,我想尝试)简要总结一下我的想法。他们都假设您使用Jackson进行json映射,并且至少使用Spring 3.1

据我所知,SpringMVC中没有enableResponseBodyCaching功能。

第一种选择:使用http缓存,因为您似乎真的想缓存整个http响应。Spring提供了一种直接的全局配置方式:

<mvc:interceptors>
    <bean id="webContentInterceptor"
          class="org.springframework.web.servlet.mvc.WebContentInterceptor">
        <property name="cacheSeconds" value="0"/>
        <property name="useExpiresHeader" value="true"/>
        <property name="useCacheControlHeader" value="true"/>
        <property name="useCacheControlNoStore" value="true"/>
    </bean>
</mvc:interceptors>

如果您希望通过每个Controller进行控制,请从Spring AbstractController继承并根据javaDoc设置cacheSeconds属性。

当然,HTTP缓存的真正强大之处在于服务器前面带有HTTP代理。

第二个想法:实现自己的MappingJackson2HttpMessageConverter子类writeInternal()其中可以添加一些逻辑,该逻辑访问缓存以检索已经映射的版本,而不是映射输入对象。这种方法意味着您将使用服务来检索Json流后面的java对象。如果因为在某些时候还可以进行缓存而对您来说还不错,那么值得尝试一下。

第三个想法:在提供原始json字符串/流的专用包装服务中自行进行json映射。您可以轻松地注入Jackson映射器(类名ObjectMapper)并获得对映射的完全控制。然后,通过注释该服务可以缓存结果。在您的Controller中,您仅提供您希望使用的相应类型ResponseEntity(字符串或某些流)。如果存在缓存的结果,这甚至将阻止更深的服务访问。

编辑:也许MappingJackson2JsonView也可以派上用场。老实说,我以前从未使用过它,所以我不能真正说出它的用法。

希望能帮助和/或给予启发!干杯

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Spring 可缓存对象

来自分类Dev

Spring MVC @RestController @ResponseBody类中如何使用HTTP状态代码响应以返回对象?

来自分类Dev

Spring缓存,缓存到硬盘而不是ram?

来自分类Dev

如何缓存 Mono 对象

来自分类Dev

如何“存储”类型(而不是“类型”对象)以备将来使用?

来自分类Dev

如何持久存储对象的值而不是其名称?

来自分类Dev

如果分配对象而不是键,如何删除本地存储?

来自分类Dev

如何持久存储对象的值而不是其名称?

来自分类Dev

如何使App Engine从数据存储区而不是内存缓存中检索属性值?

来自分类Dev

如何将数据存储在Django缓存中作为参考而不是值?

来自分类Dev

如何在Spring数据存储库上测试Spring的声明式缓存支持?

来自分类Dev

如何在Spring数据存储库上测试Spring的声明式缓存支持?

来自分类Dev

RESTKit-如何始终替换所有缓存的对象而不是进行更新?

来自分类Dev

ASP.NET 5(核心):如何在会话缓存(ISession)中存储对象?

来自分类Dev

Spring MVC:将对象转换为@ResponseBody中的基元

来自分类Dev

Spring Cache 中的 @Cacheable 将值存储在缓存外的 redis 中。我如何将它放在redis的缓存中?

来自分类Dev

如何临时禁用Spring缓存的缓存

来自分类Dev

如何在事务测试期间避免在Spring存储库中缓存实体

来自分类Dev

如何缓存用户特定的对象

来自分类Dev

如何将django对象存储为会话变量(对象不是JSON可序列化的)?

来自分类Dev

解析存储本地数据存储对象以缓存并清除它们?

来自分类Dev

如何存储中间递归结果

来自分类Dev

AngularJS HTTP在缓存对象时将对象存储在哪里?

来自分类Dev

如何让gitlab-ci-runner DinD图像缓存中间图像?

来自分类Dev

使用参数渲染时如何缓存中间结果?

来自分类Dev

我应该如何在Spring中实现一个缓存对象/系统?

来自分类Dev

我应该如何在Spring中实现一个缓存对象/系统?

来自分类Dev

如何删除Spring MVC @ResponseBody的XML标头?

来自分类Dev

如何在Guava缓存中存储地图

Related 相关文章

  1. 1

    Spring 可缓存对象

  2. 2

    Spring MVC @RestController @ResponseBody类中如何使用HTTP状态代码响应以返回对象?

  3. 3

    Spring缓存,缓存到硬盘而不是ram?

  4. 4

    如何缓存 Mono 对象

  5. 5

    如何“存储”类型(而不是“类型”对象)以备将来使用?

  6. 6

    如何持久存储对象的值而不是其名称?

  7. 7

    如果分配对象而不是键,如何删除本地存储?

  8. 8

    如何持久存储对象的值而不是其名称?

  9. 9

    如何使App Engine从数据存储区而不是内存缓存中检索属性值?

  10. 10

    如何将数据存储在Django缓存中作为参考而不是值?

  11. 11

    如何在Spring数据存储库上测试Spring的声明式缓存支持?

  12. 12

    如何在Spring数据存储库上测试Spring的声明式缓存支持?

  13. 13

    RESTKit-如何始终替换所有缓存的对象而不是进行更新?

  14. 14

    ASP.NET 5(核心):如何在会话缓存(ISession)中存储对象?

  15. 15

    Spring MVC:将对象转换为@ResponseBody中的基元

  16. 16

    Spring Cache 中的 @Cacheable 将值存储在缓存外的 redis 中。我如何将它放在redis的缓存中?

  17. 17

    如何临时禁用Spring缓存的缓存

  18. 18

    如何在事务测试期间避免在Spring存储库中缓存实体

  19. 19

    如何缓存用户特定的对象

  20. 20

    如何将django对象存储为会话变量(对象不是JSON可序列化的)?

  21. 21

    解析存储本地数据存储对象以缓存并清除它们?

  22. 22

    如何存储中间递归结果

  23. 23

    AngularJS HTTP在缓存对象时将对象存储在哪里?

  24. 24

    如何让gitlab-ci-runner DinD图像缓存中间图像?

  25. 25

    使用参数渲染时如何缓存中间结果?

  26. 26

    我应该如何在Spring中实现一个缓存对象/系统?

  27. 27

    我应该如何在Spring中实现一个缓存对象/系统?

  28. 28

    如何删除Spring MVC @ResponseBody的XML标头?

  29. 29

    如何在Guava缓存中存储地图

热门标签

归档