gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:46:58 25 4
gpt4 key购买 nike

我用这个方法使用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 cache 缓存我的对象的 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 映射。您可以轻松地注入(inject) Jackson 映射器(类名 ObjectMapper)并获得对映射的完全控制。注释此服务然后允许您缓存结果。在您的 Controller 中,您只需提供您希望使用的相应类型的 ResponseEntity (字符串或某些流)。如果存在缓存结果,这甚至会阻止更深入的服务访问。

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

希望能有所帮助和/或提供灵感!干杯

关于java - 如何让 Spring 缓存存储 ResponseBody 而不是中间对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27898307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com