日期类型,我们需要统一它在被序列化后的格式,序列化是指把java类型通过网络系统或者IO进行持久化,如把一个java对象保存到txt文件里,或者把java对象保存到redis里,又或者把java对象通过网络以JSON的格式输出到浏览器上。
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;
}