使用Ehcache @CacheEvict的Spring Cache不起作用

时间:2016-07-26 06:27:24

标签: spring ehcache spring-cache

我在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方法之后,缓存不会清除。

1 个答案:

答案 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);
    }

}