2012-08-09 13 views
6

He lo siguiente para el uso de un @Cacheable en primavera (3.1):primavera @Cacheable con claves complejas todavía ejecutado

primavera:

<?xml version="1.0" encoding="UTF-8" ?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oauth="http://www.springframework.org/schema/security/oauth2" 
    xmlns:sec="http://www.springframework.org/schema/security" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:cache="http://www.springframework.org/schema/cache" 
    xmlns:mongo="http://www.springframework.org/schema/data/mongo" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation="http://www.springframework.org/schema/security/oauth2 
          http://www.springframework.org/schema/security/spring-security-oauth2-1.0.xsd 
          http://www.springframework.org/schema/data/mongo 
          http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd 
          http://www.springframework.org/schema/cache 
          http://www.springframework.org/schema/cache/spring-cache.xsd 
          http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd 
          http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd 
          http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd 
          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"> 

<cache:annotation-driven /> 
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cache-manager-ref="ehcache" /> 
<!-- Ehcache library setup --> 
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" 
    p:config-location="classpath:ehcache.xml" /> 

Maven:

<dependency> 
     <groupId>net.sf.ehcache</groupId> 
     <artifactId>ehcache-core</artifactId> 
     <version>2.5.3</version> 
    </dependency> 

El método para ser guardado en caché:

@Cacheable(value="cahceName", key="concat(#param1).concat(‘-’).concat(#param2)") 
    public String cachedMethod(String param1,String param2) 

Por desgracia, cuando depuro el código, veo que el método en caché se llama más de una vez, incluso cuando param1 y param2 son los mismos (es decir, no se utiliza el código).

¿Alguna idea?

+0

nota: para que la caché funcione, debe llamar a un método que está en una interfaz. – checklist

+0

Hola Lista de verificación: ¿Puedes especificar cuál de las dos recomendaciones solucionó tu problema? Key = "# param1.concat ('-'). Concat (# param2)" o key = "# p0.concat ('-'). concat (# p1) "?? ¿o ambos? – HellishHeat

+0

HI. Ambos funcionaron – checklist

Respuesta

15

La clave no parece correcta -

Es posible que haya significado - @Cacheable(value="cacheName", key="#param1.concat(‘-’).concat(#param2)")

Además, si la compilación se realiza sin información de depuración, el param1, nombres de argumentos param2 no estará disponible al evaluador de expresiones. En su lugar se puede hacer referencia a ellos con p0, p1, etc de esta manera:

@Cacheable(value="cahceName", key="#p0.concat('-').concat(#p1)")

Actualización:

tengo una prueba de una página de aquí, que demuestra cómo funciona esto - https://gist.github.com/3315275

+1

¿pueden por favor elaborar en la parte de depuración? y por qué es p1 diferente de paam1 – checklist

+0

Aquí hay una pregunta relacionada: http://stackoverflow.com/questions/11041506/java-compiler-automatically-renaming-parameters-obfuscating –

+0

He corregido la clave, pero aún no lo hace trabajo. Incluso me llevo la llave por completo y mi método sigue siendo llamado. ¿Hay algo más que pueda estar haciendo mal? – checklist