2016-05-11 14 views
0

@Cacheableを使用し、同じパラメータで別のメソッドを呼び出すと、同じキーが生成されます。 SimpleKeyGeneratorキャッシュ名なしのキーが生成されました。Spring @CacheableとSimpleKeyGeneratorを使用すると衝突が発生する可能性があります

私はスプリングブート1.3.2とスプリング4.2.4を使用します。ここで

はサンプルです:

@Component 
public static class CacheableTestClass { 

    @Cacheable(cacheNames = "test-cacheproxy-echo1") 
    public String echo1(String text) { 
     return text; 
    } 

    @Cacheable(cacheNames = "test-cacheproxy-echo2") 
    public String echo2(String text) { 
     return "Another " + text; 
    } 
} 

、テストを実行します。

assertEquals("OK", cacheableTestClass.echo1("OK")); 
assertEquals("Another OK", cacheableTestClass.echo2("OK")); // Failure: expected 'Another OK', actual 'OK'. 

ので、この問題を解決する方法はありますか? ありがとうございました。

更新

は、ここに私のCacheManager構成です。

@Bean 
@ConditionalOnMissingBean(name = "cacheRedisTemplate") 
public RedisTemplate<Object, Object> cacheRedisTemplate(
     RedisConnectionFactory redisConnectionFactory) 
     throws UnknownHostException { 
    RedisTemplate<Object, Object> template = new RedisTemplate<>(); 
    template.setConnectionFactory(redisConnectionFactory); 
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); 
    template.setHashKeySerializer(template.getKeySerializer()); 
    return template; 
} 

@Bean 
public RedisCacheManager cacheManager(@Qualifier("cacheRedisTemplate") RedisTemplate<Object, Object> cacheRedisTemplate) { 
    RedisCacheManager cacheManager = new RedisCacheManager(cacheRedisTemplate); 
    cacheManager.setDefaultExpiration(
      redisCacheProperties().getDefaultExpiration()); 
    cacheManager.setExpires(redisCacheProperties().getExpires()); 
    return cacheManager; 
} 
+0

CacheManagerの設定を投稿してください。コードスニペットから、異なるキャッシュ名を使用しているときにキーが衝突しないようにしてください。 –

+0

@ekemchitsiga 'CacheManager'の設定を更新してください。 – FalconIA

答えて

2

これはSimpleKeyGeneratorとは何の関係もありませんが、これはそれが値を格納するために使用するキーの判別式として、キャッシュの名前を使用していないのRedis固有の問題です。

RedisCacheManagersetUsePrefix(true)を呼び出す必要があります。これは、あなたのためにキャッシュマネージャーを自動構成するときにSpring Bootが行うことです。デフォルトであったはずであり、今後のリリースですぐに使用できるように改善する方法を検討しています。

+0

私が正しく理解すれば、これがデフォルトモードであるべきであることは間違いありません。さらに、 'RedisCacheManager'がそれらを無視した場合、' cacheNames'のポイントは何かを理解していません – oak

+1

これはデフォルトで無視され、間違いでした。 –

+0

ありがとう、私はそれを知らなかったし、衝突のためにエラーを持っていた。今私は 'RedisCacheManager'を作成したときに' 'を設定しています(ええ、私はまだxmlを使用しています:) – oak

関連する問題