Mua*_*tik 8 java serialization spring json spring-data
我正在使用RedisCacheManager将我的缓存数据存储在我的spring-boot应用程序中.默认的串行器似乎将所有内容序列化为字节,并从字节序列化到适当的java类型.
但是,我想将缓存数据存储为json,以便我可以从非Java客户端读取它.
我发现从默认的切换到其他序列化器,如Jackson2JsonRedisSerializer应该可以工作.执行此操作后,反序列化阶段失败.
的pom.xml
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法以纯JSON格式存储它们并成功从中反序列化?
Mon*_*mul 12
在您的配置中添加此项以在redis模板中显式设置jackson序列化程序.
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;
}
Run Code Online (Sandbox Code Playgroud)
至少从spring-data-jpa:2.0.2.RELEASE起,配置默认的redis模板不会影响@Cacheable注释系列访问redis的方式。无论如何,由于我要使用redis模板做更多的事情,所以这不是我想要做的。
但是,这隔离了高速缓存管理器的配置并按预期工作:
@Configuration
@EnableCaching
public class RedisCacheManagerConfiguration {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean
public CacheManager redisCacheManager() {
RedisSerializationContext.SerializationPair<Object> jsonSerializer =
RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer());
return RedisCacheManager.RedisCacheManagerBuilder
.fromConnectionFactory(redisConnectionFactory)
.cacheDefaults(
RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofDays(1))
.serializeValuesWith(jsonSerializer)
)
.build();
}
}
Run Code Online (Sandbox Code Playgroud)
它利用Redis的通用Json序列化器(GenericJackson2JsonRedisSerializer)。
您还可以配置缓存管理器的其他方面,例如Redis中密钥的生存时间。
归档时间: |
|
查看次数: |
8128 次 |
最近记录: |