我将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] 删除。
我来说两句