Por qué los convertidores de mensajes de Spring aún se invocan en los métodos @Cachable

digamos que tengo dos métodos en mi controlador para admitir json y 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();
}

Y dos convertidores de mensajes, organizando mis objetos en una respuesta adecuada.

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jsonConverter"/>
            <ref bean="xmlConverter" />
        </list>
    </property>
</bean>

El problema es que Spring 3.1, aunque el método está anotado con @Cachable, aún invoca a marshaller para cada llamada. Almacena en caché el estado del objeto antes de ordenarlo. Esto no es aceptable porque el rendimiento es crucial aquí y la clasificación es demasiado costosa para mí. Esperaba que Spring almacenara en caché la respuesta final en tal caso. ¿Estoy haciendo algo mal aquí?

preguntado el 12 de junio de 12 a las 17:06

1 Respuestas

Para evitar este problema, se puede usar el almacenamiento en caché web ehcache: http://www.ehcache.org/documentation/user-guide/web-caching

Funciona simplemente agregando un filtro a web.xml y proporciona el almacenamiento en caché de las respuestas 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>

Respondido el 15 de junio de 12 a las 18:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.