Spring 使用 Ehcache @CacheEvict 进行缓存不起作用

Spring Cache with Ehcache @CacheEvict doesn't work

我在 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 方法后,缓存没有清除。

您所看到的是正常的。您从 Proxy 对象中调用 removeUserCacheByName(),因此捕获方面不会执行。 documentation.

中解释了此行为

您可以采取一些措施来解决此问题:

1) 将 evict 方法 (removeUserCacheByName) 带到另一个 bean,在 updateToken() 的 class 中自动装配它,然后调用它。

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

}