我在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的/)。這與我的問題有關嗎? –