2016-07-26 41 views
0

ich nächste Methode in Userservice haben:Frühling Cache mit Ehcache @CacheEvict nicht funktioniert

@Cacheable(value = "user", key="#p0") 
public User find(String user) { 
    return userRepository.findByUser(User); 
} 

Es ist gut zwischenspeichert. In anderen Dienst habe ich:

@Transactional 
public void updateToken(int id, String token) { 
    Group group = groupRepository.findOne(id); 
    group.getMembers().forEach(member -> { 
     member.getUser().setToken(token); 
     removeUserCacheByName(member.getUser().getName()); 
    }); 
    groupRepository.save(group); 
} 

@CacheEvict(value = "user", key="#p0") 
public void removeUserCacheByName(String name) { 
    log.debug("Removing user cache by name {}.", name); 
} 

Nach der updateToken-Methode wird Cache nicht gelöscht.

+0

siehe [diese] (http://stackoverflow.com/a/ 14077831/1910582) –

+1

Es sieht so aus, als ob Ihre Konfiguration try Sam

+0

Ich habe @EnableCaching ausprobiert (mode = AdviceMode. ASPECTJ) und es funktioniert auch nicht. – Feeco

Antwort

0

Was Sie sehen, ist normal. Sie rufen innerhalb des Proxy-Objekts removeUserCacheByName() auf, sodass der Fangaspekt nicht ausgeführt wird. Sie haben dieses Verhalten in der documentation

erklärt Sie können einige Dinge tun, um dies zu umgehen:

1) Nehmen Sie die evict Methode (removeUserCacheByName) zu einem anderen Bohne, autowire es in updateToken() 's-Klasse und nennen.

2) Eine hässliche, aber nützlich ein, autowire die Application, von der sie das gleiche Objekt erhalten und rufen Sie die Methode, zB:

public class UserService{ 

    @Autowired 
    private ApplicationContext ac; 

    @Transactional 
    public void updateToken(int id, String token) { 
     Group group = groupRepository.findOne(id); 
     group.getMembers().forEach(member -> { 
      member.getUser().setToken(token); 
      UserService sameBean = ac.getBean(UserService.class); 
      sameBean.removeUserCacheByName(member.getUser().getName()); 
     }); 
     groupRepository.save(group); 
    } 

    @CacheEvict(value = "user", key="#p0") 
    public void removeUserCacheByName(String name) { 
     log.debug("Removing user cache by name {}.", name); 
    } 

} 
+0

Beides funktioniert nicht für mich. Im ersten Fall habe ich 'removeUserCacheByName' in UserService verschoben und 'updateToken' von GroupService aufgerufen. In der zweiten habe ich beide Methoden in einem Dienst gespeichert. Darf es sich auf meine [andere Frage] beziehen (http://stackoverflow.com/questions/38581039/ehcache-with-spring-cache-assigns-wrong-key)? – Feeco