日期類型,我們需要統一它在被序列化後的格式,序列化是指把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;
}