2017-01-26 3 views
1

RedisCacheManagerを使用してSpringデータをSpringブートアプリケーションに保存しています。デフォルトのシリアライザは、すべてをバイト列にシリアライズし、バイトから適切なJava型に逆シリアル化しているようです。spring-data-redisを使用してraw jsonをredisで保存します。

しかし、私はnone-javaクライアントから読み取ることができるように、キャッシュデータをjsonとして保存する必要があります。

私は、デフォルトのものからJackson2JsonRedisSerializerのような他のシリアライザに切り替えることができることが判明しました。これを実行すると、デシリアライズフェーズが失敗します。

のpom.xml

<dependency> 
     <groupId>org.springframework.data</groupId> 
     <artifactId>spring-data-redis</artifactId> 
    </dependency> 

    <dependency> 
     <groupId>redis.clients</groupId> 
     <artifactId>jedis</artifactId> 
    </dependency> 

CacheConfig.java

@Configuration 
@EnableCaching 
public class CacheConfig { 

    @Bean 
    public RedisConnectionFactory createRedisConnectionFactory() { 
     JedisConnectionFactory factory = new JedisConnectionFactory(); 
     factory.setHostName("localhost"); 
     return factory; 
    } 

// SPRING-DATA-REDIS ALREADY PROVIDES A STRING REDIS TEMPLATE, SO THE FOLLOWING IS NOT NECESSARY 
// @Bean 
// public RedisTemplate<String, String> createRedisTemplate(RedisConnectionFactory factory) { 
//  RedisTemplate<String, String> redisTemplate = new RedisTemplate<>(); 
//  redisTemplate.setConnectionFactory(factory); 
//  return redisTemplate; 
// } 

    @Bean 
    public CacheManager redisCacheManager(RedisTemplate redisTemplate) { 
     RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); 
     return cacheManager; 
    } 
} 

純粋なJSON形式に保存し、成功してからデシリアライズする方法はありますか?

答えて

3

これを設定に追加して、明示的にjackisシリアライザを赤いテンプレートで設定します。

public @Bean RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) { 

    RedisTemplate<Object, Object> template = new RedisTemplate<>(); 
    template.setConnectionFactory(connectionFactory); 
    template.setDefaultSerializer(new GenericJackson2JsonRedisSerializer()); 
    template.setKeySerializer(new StringRedisSerializer()); 
    template.setHashKeySerializer(new GenericJackson2JsonRedisSerializer()); 
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); 
    return template; 
} 
+0

私はすでにこれを試しましたが、redisのキャッシュデータはまだバイトです。 x00 \ x05valuexr \ x00 \ x10java.langのように、\ xac \ x00 \ x05sr \ x00 \ x0ejava.lang.Long \ x8b \ xe4 \ x90 \ xcc \ x8f#\ xdf \ x02 \ x00 \ x01J \ x00 \ xxx \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x01 " – Muatik

+0

アップデートされた設定は、今すぐご確認ください。 – mhshimul

+0

更新された回答を確認しましたか?お知らせ下さい。 – mhshimul

0

私はRedisConnectionFactory

@Bean 
public RedisConnectionFactory jedisPool() 
{ 
    JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(new JedisPoolConfig()); 
    jedisConnectionFactory.setHostName("localhost"); 

    return jedisConnectionFactory; 
} 

を定義して、私はこれが役立つかもしれない願っていStringRedisTemplate

ValueOperations<String, String> ops = redisTemplate.opsForValue(); 
ops.set("key", "Json_string"); 

を使用してこれを作るために管理!

+0

redisTemplateを直接使用すると、データの入出力を完全に制御できます。しかし、私の場合、cacheManagerがredisTemplateをキャッシュ操作に使用する場合、@ Cacheable、@ Cacheputなどのキャッシュ注釈を使用します。 – Muatik

+0

これはあなたを助けるかもしれない? https://github.com/spring-projects/spring-session/issues/387 – mgalala

+0

ありがとう、私はそれを見てみましょう – Muatik

関連する問題