2016-07-26 94 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