假设我的控制器中有两个方法来支持json和xml。
@RequestMapping(value = "/get/response.json", method = RequestMethod.GET)
@Cacheable(JSON_CACHE)
public @ResponseBody JSONResponse getJsonResponse(){
return responseService.getJsonResponse();
}
@RequestMapping(value = "/get/response.xml", method = RequestMethod.GET)
@Cacheable(XML_CACHE)
public @ResponseBody XMLResponse getXmlResponse(){
return responseService.getXmlResponse();
}
两个消息转换器,将我的对象编组到合适的响应中。
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonConverter"/>
<ref bean="xmlConverter" />
</list>
</property>
</bean>
问题是Spring 3.1,即使方法用@Cachable
注释,仍然会为每个调用调用marshaller。它在编组之前缓存对象的状态。
这是不可接受的,因为性能在这里至关重要,编组对我来说太贵了。我希望Spring在这种情况下缓存最终的响应。我在这里做错了吗?
答案 0 :(得分:1)
为避免此问题,可以使用ehcache网络缓存:http://www.ehcache.org/documentation/user-guide/web-caching
它只需向web.xml添加过滤器并提供HTTP响应的缓存即可。
<filter>
<filter-name>SimpleCachingHeadersPageCachingFilter</filter-name>
<filter-class>net.sf.ehcache.constructs.web.filter.SimpleCachingHeadersPageCachingFilter
</filter-class>
<init-param>
<param-name>suppressStackTrace</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>cacheName</param-name>
<param-value>CachedPage2Cache</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SimpleCachingHeadersPageCachingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>