消息转换器

在日常开发中,经常会遇到一个问题,就是传输对象的时间数据json和对象之间的转换问题。

针对这个问题,之前我知道的方法只有通过注解@JsonFormat(pattern = "yyyy-MM-dd")来指定格式进行转换,但是这种方式有一个麻烦的地方在于,需要在每一个时间属性的上方都加上这个注解。

其实,还有另一个解决方法,就是通过springmvc的消息转换器,可以统一的进行消息对象的转换,包括对日期对象格式的处理。

MessageConverters

  1. 作用:将controller方法的返回值转换为http响应的内容
  2. 原理:当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中

posted @ 2024-09-18 12:23  yuqiu2004  阅读(10)  评论(0编辑  收藏  举报