我在UserService中有下一个方法:
@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 :(得分:2)
你所看到的是正常的。您正在从Proxy对象中调用removeUserCacheByName()
,因此捕获方面不会执行。您在documentation
你可以做一些事情来解决这个问题:
1)将evict方法(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);
}
}