2013-04-06 2 views
0

Я пытаюсь использовать механизм абстракции строкового кэша с помощью графических модулей. Я создал перехватчики:Не удается выселить из Spring Cache в Guice DI app

CacheManager cacheManager = createCacheManager(); bind (CacheManager.class) .toInstance (cacheManager);

AppCacheInterceptor interceptor = new AppCacheInterceptor(
      cacheManager, 
      createCacheOperationSource() 
    ); 

    bindInterceptor(
      Matchers.any(), 
      Matchers.annotatedWith(Cacheable.class), 
      interceptor 
    ); 

    bindInterceptor(
      Matchers.any(), 
      Matchers.annotatedWith(CacheEvict.class), 
      interceptor 
    ); 

Затем реализован интерфейс Строки кэша и CacheManager, и, наконец, аннотированный мои классы DAO с @Cachable и @CacheEvict:

public class DaoTester { 

QssandraConsumer qs; 

@CachePut(value = "cached_consumers", key = "#consumer.id") 
public void save(QssandraConsumer consumer) { 
    qs = consumer; 
} 

@Cacheable(value = "cached_consumers") 
public QssandraConsumer get(String id) { 
    if (id != null) { 
     qs.getId(); 
    } 
    return qs; 
} 

@CacheEvict(value = "cached_consumers", key = "#consumer.id") 
public void remove(QssandraConsumer consumer) { 
    qs = consumer; 
}} 

Кэширование не просто отлично - никаких проблем здесь, но когда я пытаюсь выселить (вызов метода удаления в данном примере), Evrything аварий и вижу:

Исключение в потоке «основного» org.springframework.expression.spel.SpelEvaluationException: EL1007E: (поз 10): поле или свойство «идентификатор 'ca Nnot быть найдены на нуль в org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty (PropertyOrFieldReference.java:205) в org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal (PropertyOrFieldReference.java:72) at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal (CompoundExpression.java:57) at org.springframework.expression.spel.ast.SpelNodeImpl.getValue (SpelNodeImpl.java:93) at org.springframework.expression .spel.standard.SpelExpression.getValue (SpelExpression.java:88) at org.springframework.cache.interceptor.ExpressionEvaluator.key (ExpressionEvaluator.java:80) at org.springframework.cache.interceptor.CacheAspectSupport $ CacheOperationContext.generateKey (CacheAspectSupport.java:464) в org.springframework.cache.interceptor.CacheAspectSupport.inspectCacheEvicts (CacheAspectSupport.java:260) на org.springframework.cache.interceptor.CacheAspectSupport.inspectAfterCacheEvicts (CacheAspectSupport.java:232) в org.springframework.cache.interceptor. CacheAspectSupport.execute (CacheAspectSupport.java:215) на org.springframework.cache.interceptor.CacheInterceptor.invoke (CacheInterceptor.java:66) на qiwi.qommon.deployment.dao.DaoTester.main (DaoTester.java:44) на sun.reflect.NativeMethodAccessorImpl.invoke0 (нативный метод) на sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) на java.lang.reflect.Method.invoke (Method.java:597) в com.intellij.rt.execution.application.AppMain.main (AppMain.java:120)

Что здесь не так ?! BTW, кэшировать объект:

public class QssandraConsumer implements Identifiable<String> { 
private String id; 
private String host; 

@Override 
public String getId() { 
    return id; 
} 

@Override 
public void setId(String id) { 
    this.id = id; 
} 

public String getHost() { 
    return host; 
} 

public void setHost(String host) { 
    this.host = host; 
} 

@Override 
public boolean equals(Object object) { 
    if (this == object) { 
     return true; 
    } 
    if (null == object) { 
     return false; 
    } 


    if (!(object instanceof QssandraConsumer)) { 
     return false; 
    } 

    QssandraConsumer o = (QssandraConsumer) object; 

    return 
     Objects.equal(id, o.id) 
      && Objects.equal(host, o.host); 
} 

@Override 
public int hashCode() { 
    return Objects.hashCode(
     id, host 
    ); 
} 

@Override 
public String toString() { 
    return Objects.toStringHelper(this) 
     .addValue(id) 
     .addValue(host) 
     .toString(); 
} 

}

ответ

0

Наконец-то я понял, в чем была причина проблемы: при введении класс, который использует аннотацию (которые перехватываются, как @Cachable или @CacheEvict) Guice улучшает класс (AOP делает модификацию байт-кода во время выполнения). Поэтому, когда CacheInterceptor попытался оценить key = "#consumer.id", он потерпел неудачу, потому что не смог найти имя аргумента в расширенном классе (см.: LocalVariableTableParameterNameDiscoverer#inspectClass). Таким образом, он не будет работать в Guice из коробки. Весной создан прокси-класс - поэтому проблем здесь нет.

Смежные вопросы