解決 redis 序列化 java8 LocalDateTime 問題
問題背景
目前項目全面支持JDK1.8,使用 LocalDateTime 代替 Date,原因爲 date 格式化時不安全。
問題描述
org. springframework. data. redis. serializer. SerializationException: Could not read JSON: Can not construct instance of java. time. LocalDateTime: no suitable constructor found, can not deserialize from Object value ( missing default constructor or creator, or perhaps need to add/ enable type information? )
問題分析
GenericJackson2JsonRedisSerializer 解析 出錯
解決方案一(全局)
引入依賴
< dependency>
< groupId> com. fasterxml. jackson. datatype< / groupId>
< artifactId> jackson- datatype- jsr310< / artifactId>
< version> 2.10 .3 < / version>
< / dependency>
RedisConfiguration 配置文件中修改如下
關鍵代碼
om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
om.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule())
.registerModule(new ParameterNamesModule());
@Bean
@Primary
public GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer ( ) {
ObjectMapper om = new ObjectMapper ( ) ;
om. disable ( SerializationFeature. WRITE_DATES_AS_TIMESTAMPS) ;
om. setVisibility ( PropertyAccessor. ALL, JsonAutoDetect. Visibility. ANY) ;
om. enableDefaultTyping ( ObjectMapper. DefaultTyping. NON_FINAL) ;
om. disable ( SerializationFeature. WRITE_DATES_AS_TIMESTAMPS) ;
om. registerModule ( new Jdk8Module ( ) )
. registerModule ( new JavaTimeModule ( ) )
. registerModule ( new ParameterNamesModule ( ) ) ;
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer ( om) ;
return genericJackson2JsonRedisSerializer;
}
@Bean
@Primary
public RedisTemplate redisTemplate ( ) {
checkData ( ) ;
RedisConnectionFactory redisConnectionFactory = lettuceConnectionFactory ( genericObjectPoolConfig ( ) ) ;
RedisTemplate< String, Object> redisTemplate = new RedisTemplate < String, Object> ( ) ;
redisTemplate. setConnectionFactory ( redisConnectionFactory) ;
redisTemplate. setKeySerializer ( new StringRedisSerializer ( ) ) ;
redisTemplate. setValueSerializer ( genericJackson2JsonRedisSerializer ( ) ) ;
redisTemplate. setHashKeySerializer ( new StringRedisSerializer ( ) ) ;
redisTemplate. setHashValueSerializer ( genericJackson2JsonRedisSerializer ( ) ) ;
redisTemplate. setEnableTransactionSupport ( true ) ;
redisTemplate. afterPropertiesSet ( ) ;
return redisTemplate;
}
@Bean
@Override
public CacheManager cacheManager ( ) {
RedisSerializer< String> stringSerializer = new StringRedisSerializer ( ) ;
Jackson2JsonRedisSerializer< Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer < Object> ( Object. class ) ;
ObjectMapper om = new ObjectMapper ( ) ;
om. setVisibility ( PropertyAccessor. ALL, JsonAutoDetect. Visibility. ANY) ;
om. enableDefaultTyping ( ObjectMapper. DefaultTyping. NON_FINAL) ;
om. disable ( SerializationFeature. WRITE_DATES_AS_TIMESTAMPS) ;
om. registerModule ( new JavaTimeModule ( ) ) ;
om. disable ( SerializationFeature. WRITE_DATES_AS_TIMESTAMPS) ;
om. registerModule ( new Jdk8Module ( ) )
. registerModule ( new JavaTimeModule ( ) )
. registerModule ( new ParameterNamesModule ( ) ) ;
jackson2JsonRedisSerializer. setObjectMapper ( om) ;
RedisCacheConfiguration config = RedisCacheConfiguration. defaultCacheConfig ( )
. serializeKeysWith ( RedisSerializationContext. SerializationPair. fromSerializer ( stringSerializer) )
. serializeValuesWith ( RedisSerializationContext. SerializationPair. fromSerializer ( jackson2JsonRedisSerializer) )
. disableCachingNullValues ( )
. entryTtl ( Duration. ofMinutes ( 30 ) ) ;
RedisCacheManager. RedisCacheManagerBuilder builder = RedisCacheManager. RedisCacheManagerBuilder
. fromConnectionFactory ( lettuceConnectionFactory ( genericObjectPoolConfig ( ) ) )
. cacheDefaults ( config)
. transactionAware ( ) ;
@SuppressWarnings ( "serial" )
Set< String> cacheNames = new HashSet < String> ( ) {
{
add ( "codeNameCache" ) ;
}
} ;
builder. initialCacheNames ( cacheNames) ;
return builder. build ( ) ;
}
解決方案二(單個字段)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
protected LocalDateTime createTime;