在不真正了解您的确切用例的情况下(不幸的是,我还不允许添加评论以询问),我尝试对我的想法进行简短总结。他们都假设您使用 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>
如果你想控制每个控制器,从 Spring AbstractController继承并根据 javaDoc 设置 cacheSeconds 属性。
http 缓存的真正威力当然是在你的服务器前面有一个 http 代理。
第二个想法:实现您自己的MappingJackson2HttpMessageConverter子类。writeInternal()
您可以添加一些逻辑来访问缓存以检索已映射的版本,而不是映射输入对象。这种方法意味着您将访问您的服务以检索 Json 流后面的 java 对象。如果这对您来说很好,因为在某些时候也有缓存,那么这种方法值得一试恕我直言。
第三个想法:在提供原始 json 字符串/流的专用包装服务中自行进行 json 映射。您可以轻松地注入 Jackson 映射器(类名ObjectMapper)并获得对映射的完全控制。注释此服务然后允许您缓存结果。在您的控制器中,您只提供您希望使用的相应类型的ResponseEntity(字符串或某些流)。如果存在缓存结果,这甚至会阻止更深入的服务访问。
编辑:可能MappingJackson2JsonView也可以派上用场。老实说,我以前从未使用过它,所以我不能真正说出它的用法。
希望能有所帮助和/或给予灵感!干杯