La primavera de caché con la variable de instancia y los parámetros clave
-
21-12-2019 - |
Pregunta
Estoy usando ehcache para el almacenamiento en caché de los resultados del método.La clave tiene que ser una combinación de ambos miembros de objeto y el método del parámetro.Mi clase se ve algo como:
Class A {
private B b;
@Cacheable(value="someCache",key="some key based on B and C")
public Result getResult(C c){
......
}
Necesito la clave para estar basadas en B y C.Me refería https://code.google.com/p/ehcache-spring-annotations/issues/detail?id=69 pero no se especifica la manera de incluir el parámetro de método en la generación de claves.Podría alguien ayudarme con esto?
Solución 2
He implementado un generador de claves personalizados para resolver esto.Aún así, creo que esto puede ser resuelto por Ehcache sin usar un generador de claves personalizados.Pero no pude obtener la respuesta en ninguna parte.Por favor, vea mi respuesta a continuación:
@Component
public class Home {
private Parameter param;
@Cacheable(cacheName = "homeCache",
keyGenerator = @KeyGenerator(name = "com.myapp.cache.Home.ParamKeyGenerator"))
public Result getPerson(Person p) {
//Do something with p
return result;
}
public Parameter getParam() {
return param;
}
public void setParam(Parameter param) {
this.param = param;
}
public static class ParamKeyGenerator implements CacheKeyGenerator<Serializable> {
public Serializable generateKey(MethodInvocation methodInvocation) {
Object[] obj = methodInvocation.getArguments();
Home h = (Home) methodInvocation.getThis();
return this.generateKey(obj[0], h.getParam());
}
public Serializable generateKey(Object... data) {
String key = ((Person) data[0]).getName() + ((Parameter) data[1]).getName();
System.out.println("generating key: " + key);
return key;
}
}
}
Otros consejos
usted puede tener acceso a la A
objeto con root.target
en la clave.por ejemplo,
key="#root.target.b.id+'-'+#c.id"