消息转换器
在日常开发中,经常会遇到一个问题,就是传输对象的时间数据json和对象之间的转换问题。
针对这个问题,之前我知道的方法只有通过注解@JsonFormat(pattern = "yyyy-MM-dd")来指定格式进行转换,但是这种方式有一个麻烦的地方在于,需要在每一个时间属性的上方都加上这个注解。
其实,还有另一个解决方法,就是通过springmvc的消息转换器,可以统一的进行消息对象的转换,包括对日期对象格式的处理。
MessageConverters
- 作用:将controller方法的返回值转换为http响应的内容
- 原理:当controller返回一个对象时,消息转换器进行转换,将Java对象转换为特定的类型,例如json、xml、html等
使用:
1.在继承自WebMvcConfigurationSupport的配置类中重写方法extendMessageConverters
2.自定义对象转换器类
1.概念:将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象] | 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
2.实现:
-
继承ObjectMapper
-
重写构造方法
public class JacksonObjectMapper extends ObjectMapper { public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; //public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm"; public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss"; public JacksonObjectMapper() { super(); //收到未知属性时不报异常 this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false); //反序列化时,属性不存在的兼容处理 this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); //三种时间类型分别添加反序列化和序列化的格式 SimpleModule simpleModule = new SimpleModule() .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))) .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))) .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))) .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))) .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))) .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))); //注册功能模块 例如,可以添加自定义序列化器和反序列化器 this.registerModule(simpleModule); } }
3.重写方法中创建一个消息转换器对象converter,为消息转换器设置自定义的对象转换器
4.将消息转换器对象扩展加入消息转换器列表converters中