springboot~jackson和redis日(ri)期序列化
日期類型,我們需要(yao)統(tong)一它(ta)在被(bei)序列(lie)化后的格(ge)(ge)式,序列(lie)化是指把(ba)(ba)(ba)java類型通(tong)過(guo)網絡系統(tong)或(huo)者IO進行(xing)持久化,如把(ba)(ba)(ba)一個java對(dui)(dui)象保存(cun)到(dao)(dao)txt文件里,或(huo)者把(ba)(ba)(ba)java對(dui)(dui)象保存(cun)到(dao)(dao)redis里,又或(huo)者把(ba)(ba)(ba)java對(dui)(dui)象通(tong)過(guo)網絡以JSON的格(ge)(ge)式輸(shu)出(chu)到(dao)(dao)瀏覽器上(shang)。
jackson的日期序列化
public class JacksonDateSerializerModifier extends BeanSerializerModifier {
@Override
public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) {
for (Object beanProperty : beanProperties) {
BeanPropertyWriter writer = (BeanPropertyWriter) beanProperty;
Class<?> clazz = writer.getType().getRawClass();
if (clazz.equals(Date.class)) {
writer.assignSerializer(new DateSerializer());
}
}
return beanProperties;
}
/**
* 格式化日期
*/
public class DateSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object date, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException {
if (date == null) {
jsonGenerator.writeNumber(StringUtils.EMPTY);
}
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai");
format.setTimeZone(timeZone);
String dateString = "\"" + format.format(date) + "\"";
jsonGenerator.writeNumber(dateString);
}
}
}
通過redisTempleate輸出到redis里
@Bean(name = "redisTemplate")
@ConditionalOnClass(RedisOperations.class)//依據RedisOperations是否存在而決定是否注冊這個bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 日期序列化處理
om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
om.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule())
.registerModule(new ParameterNamesModule());
om.activateDefaultTyping(
LaissezFaireSubTypeValidator.instance ,
ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.WRAPPER_ARRAY);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}