redis序列化设置
redis序列化设置
redis序列化设置,通过自定义redisTemplate配置
java
@Component
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer strRedisSerializer = new StringRedisSerializer();
//序列化key值
redisTemplate.setKeySerializer(strRedisSerializer);
//解决value的序列化方式
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
return redisTemplate;
}
}
到这若测试没问题,下面就不用看了
序列化对象里有org.joda.time.DateTime
1)、报错内容如下
org.springframework.data.redis.serializer.SerializationException: Could not write JSON: Joda date/time type
org.joda.time.DateTime not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-joda" to enable handling
java
org.springframework.data.redis.serializer.SerializationException: Could not write JSON: Joda date/time type `org.joda.time.DateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-joda" to enable handling (through reference chain: com.xx.XXModel["BBModel"]->com.xx.XXModel["startDate"]);
...
2)、解决方案:分别自定义时间的序列化和反序列化,以对象形式关联到redisTemplate
分别自定义一个org.joda.time.DateTime的序列化和发序列化类,然后关联到自定义的redisTemplate,代码如下:
1、DateTimeJsonDeserializer
java
public class DateTimeJsonDeserializer extends JsonDeserializer<DateTime> {
@Override
public DateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JacksonException {
String dateString = jsonParser.readValueAs(String.class);
DateTimeFormatter formatter= DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
return DateTime.parse(dateString, formatter);
}
}
2、DateTimeJsonSerializer
java
public class DateTimeJsonSerializer extends JsonSerializer<DateTime> {
@Override
public void serialize(DateTime dateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(dateTime.toString());
}
}
3、RedisConfig
java
@Component
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer strRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(strRedisSerializer);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper=new ObjectMapper();
SimpleModule simpleModule=new SimpleModule();
simpleModule.addSerializer(DateTime.class, new DateTimeJsonSerializer());
simpleModule.addDeserializer(DateTime.class, new DateTimeJsonDeserializer());
objectMapper.registerModule(simpleModule);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
return redisTemplate;
}
}