2016-07-26 93 views
0

我有一個方法在UserService:春緩存中的Ehcache @CacheEvict不起作用

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

它緩存很好。在其他服務中,我有:

@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); 
} 

updateToken方法後,緩存不清除。

+0

見[此](http://stackoverflow.com/a/ 14077831/1910582) –

+1

看起來你的配置是 try Sam

+0

我試過@EnableCaching(mode = AdviceMode。 ASPECTJ),它也不起作用。 – Feeco

回答

0

你看到的是正常的。您從Proxy對象中調用removeUserCacheByName(),因此捕捉方面不會執行。你有這樣的行爲在documentation

解釋你可以做一些事情來解決此問題:

1)取逐出法(removeUserCacheByName)到另外一個bean,自動裝配它updateToken()的類,並且叫它。

2)難看但有用的一種,自動裝配ApplicationContext時,從它那裏得到相同的對象和調用該方法,如:

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

兩者都不適合我。在第一種情況下,我將'removeUserCacheByName'移至UserService並從GroupService中調用'updateToken'。第二,我將這兩種方法一起存儲在一個服務中。可能是指我的[另一個問題](http://stackoverflow.com/questions/38581039/ehcache-with-spring-cache-assigns-wrong-key)? – Feeco