我在Spring MVC中有经验,但第一次使用Cache。这些是我已经完成的步骤。Spring @CacheEvict不工作
步骤:1
//在弹簧配置
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager("user");
}
//缓存对象
public class CachedUser {
private String username;
private String token;
// Public getter-setter
}
// AuthServiceImp
@Service
public class AuthServiceImp implements AuthService {
@Override
@Cacheable(value="user", key="#token")
@Transactional
public CachedUser loadUserDetailsFromDb(String username, String token) {
// codes here
}
@Override
@CacheEvict(value="user", key="#token")
@Transactional
public void removeUser(String username, String token) {
// codes here
}
}
//我的过滤器
public class AuthenticationTokenFilter extends UsernamePasswordAuthenticationFilter {
AuthService authService = WebApplicationContextUtils
.getRequiredWebApplicationContext(this.getServletContext())
.getBean(AuthService.class);
CachedUser user = this.authService.loadUserDetailsFromDb(username, authToken);
}
//控制器
@RestController
public class AuthenticationController {
@Autowired
private AuthService authService;
@GetMapping("logout2")
public ResponseModel logout(@RequestAttribute("username") String username,
HttpServletRequest request) {
String token = request.getHeader(tokenHeader);
authService.removeUser(username, token);
return new ResponseModel(200,"Success",null);
}
}
每当调用loadUserDetailsFromDb
从AuthenticationTokenFilter
它(显然除了在第一次调用)返回缓存的对象。这意味着@Cacheable(value="user", key="#token")
工作正常。
但即使在我注销并调用authService.removeUser()
后,调用loadUserDetailsFromDb()
也会提取缓存的对象。这意味着@CacheEvict(value="user", key="#token")
不起作用。
第2步:
简称this和移动removeUser()
到另一个服务(比如CacheServiceImp implements CacheService
),但同样的问题。
步骤:3
下文称this,并通过我的理解,感动@Cache*
注释接口AuthService
,得到了下面的错误。
java.lang.IllegalArgumentException异常:空键返回缓存 操作(也许你正在使用的类名为PARAMS没有调试 信息?)
注:是不是驱逐的问题,因为我打电话来自不同类别的@Cacheable
和@CacheEvict
方法。这是从AuthenticationTokenFilter
和AuthenticationController
我觉得你的实现看起来正确。也许你忘记了你的配置类中的@EnableCaching注释? – pDer666
'@ EnableCaching'在我的配置类中。 '@ Cacheable'工作正常。 –
进一步的搜索为我带来了这个“** JDK ConcurrentMap,它对于简单的用例已经足够了,但不支持持久性或驱逐策略**”[link](http://websystique.com/spring/spring-4 -cache教程与 - ehcache的/)。这与我的问题有关吗? –