私はSpring MVCで初めての経験ですが、キャッシュを使用しています。これらは私がまだやったことです。Spring @CacheEvictが動作しない
手順:1
//ばねconfigに
@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);
}
}
AuthenticationTokenFilter
からloadUserDetailsFromDb
を呼び出すたびに、それは、(明らかに最初の呼び出しを除く)キャッシュされたオブジェクトを返します。つまり、@Cacheable(value="user", key="#token")
は問題なく動作しています。
ログアウトしてauthService.removeUser()
を呼び出した後でも、loadUserDetailsFromDb()
を呼び出すと、キャッシュされたオブジェクトが取得されます。つまり、@CacheEvict(value="user", key="#token")
は機能しません。
ステップ:2
thisを呼び、別のサービス(CacheServiceImp implements CacheService
と言う)にremoveUser()
を移動し、まだ同じ問題。
ステップ:3
Reffered thisと、私の理解で、AuthService
をインタフェースする@Cache*
注釈を移動し、次のエラーを得ました。
java.lang.IllegalArgumentExceptionが:が立ち退かないの問題です:ヌルキーはキャッシュ 操作(?多分あなたは 情報をデバッグすることなく、クラスにparamsという名前を使用している)
ノートに返さなぜなら私は@Cacheable
と@CacheEvict
メソッドを別のクラスから呼び出すからです。それはAuthenticationTokenFilter
とAuthenticationController
私はあなたの実装が正しく見えると思います。おそらくあなたは設定クラスで@EnableCachingアノテーションを忘れていたでしょうか? – pDer666
'@ EnableCaching'は私の設定クラスにあります。そして '@ Cacheable'は正常に動作しています。 –
これ以降の検索では、このポスト[**](http://websystique.com/spring/spring-4)から「** JDK ConcurrentMapは単純なユースケースには十分ですが、永続性または追放ポリシーはサポートしていません**」 -cache-tutorial-with-ehcache /)を実行します。これは私の問題と関係がありますか? –