基于SpringMVC的消息转换器来实现统一处理所有日期格式

回顾Jackson转换json数据

<span style="background-color:#f8f8f8"><span style="color:#000000"> <span style="color:#aa5500">//java对象转换成json数据</span>
 <span style="color:#000000">ObjectMapper</span> <span style="color:#000000">objectMapper</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">ObjectMapper</span>();
 <span style="color:#008855">String</span> <span style="color:#000000">jsonStr</span> <span style="color:#981a1a">=</span> <span style="color:#000000">objectMapper</span>.<span style="color:#000000">writeValueAsString</span>(<span style="color:#000000">对象</span>);
 ​
 <span style="color:#000000">注意</span>:<span style="color:#000000">这里的</span> <span style="color:#000000">jsonStr</span> <span style="color:#000000">就是我们将对象转换成json数据</span></span></span>

默认情况下,我们springMVC框架使用的就是Jackson来对json数据进行序列化和反序列化,当我们所操作的类型是

LocalDateTime的时候.我们是需要额外进行处理的,所以我们给大家在项目中提供了一个现成的ObjectMapper

基于SpringMVC的消息转换器来实现

SpringMVC消息转换器HttpMessageConverter_jaxb2rootelementhttpmessageconverter_梁云亮的博客-CSDN博客

<span style="background-color:#f8f8f8"><span style="color:#000000"> <span style="color:#770088">protected</span> <span style="color:#008855">void</span> <span style="color:#0000ff">extendMessageConverters</span>(<span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#000000">HttpMessageConverter</span><span style="color:#981a1a"><?>></span> <span style="color:#000000">converters</span>) {
     <span style="color:#aa5500">//创建一个消息转换器对象</span>
     <span style="color:#000000">MappingJackson2HttpMessageConverter</span> <span style="color:#000000">messageConverter</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">MappingJackson2HttpMessageConverter</span>();
     <span style="color:#aa5500">//需要为消息转换器设置一个对象转换器,对象转换器可以将Java对象序列化为json数据</span>
     <span style="color:#000000">messageConverter</span>.<span style="color:#000000">setObjectMapper</span>(<span style="color:#770088">new</span> <span style="color:#000000">JacksonObjectMapper</span>());
     <span style="color:#aa5500">//将自己的消息转化器加入容器中</span>
     <span style="color:#000000">converters</span>.<span style="color:#000000">add</span>(<span style="color:#116644">0</span>,<span style="color:#000000">messageConverter</span>);
 }</span></span>

这种方式的原理就是将我们自己提供的JacksonObjectMapper代替SpringMVC内置默认的ObjectMapper

具体步骤

1.JacksonObjectMapper 开发的时候可以直接拿来使用

/**
 * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
 * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
 * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
 */
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()
                //反序列化 => LocalDateTime处理
                .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)))
                //序列化 => LocalDateTime处理
                .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);
    }
}

2.在WebMvcConfiguration中复写 extendMessageConverters方法

@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {

    @Autowired
    private JwtTokenAdminInterceptor jwtTokenAdminInterceptor;

    /**
     * 配置消息转换器
     * @param converters
     */
    @Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
       //自己创建一个ObjectMapper对LocalDateTime类型进行处理
        //创建一个消息转换器对象
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
        //需要为消息转换器设置一个对象转换器,对象转换器可以将Java对象序列化为json数据
        messageConverter.setObjectMapper(new JacksonObjectMapper());
        //将自己的消息转化器加入容器中
        converters.add(0,messageConverter);
    }

最后总结

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值