2016-12-04 34 views
3

私は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メソッドを別のクラスから呼び出すからです。それはAuthenticationTokenFilterAuthenticationController

+0

私はあなたの実装が正しく見えると思います。おそらくあなたは設定クラスで@EnableCachingアノテーションを忘れていたでしょうか? – pDer666

+0

'@ EnableCaching'は私の設定クラスにあります。そして '@ Cacheable'は正常に動作しています。 –

+0

これ以降の検索では、このポスト[**](http://websystique.com/spring/spring-4)から「** JDK ConcurrentMapは単純なユースケースには十分ですが、永続性または追放ポリシーはサポートしていません**」 -cache-tutorial-with-ehcache /)を実行します。これは私の問題と関係がありますか? –

答えて

関連する問題