Java笔记-29、功能实现-全局日期时间格式化、WebMvcConfigurationSupport

全局日期时间格式化

如果不对日期时间的格式进行处理,返回给前端的数据中,日期时间格式会很乱。

在之前的项目tlias中,对于时间格式的处理是在VO或者Entities的属性上加注解,对日期进行格式化:

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;

但需要在每个时间属性上都要加上该注解,使用较麻烦,不能全局处理。

如何全局处理呢?

又要用到WebMvcConfigurationSupport了。

WebMvcConfigurationSupport与WebMvcConfigurer

WebMvcConfigurer是接口,用于配置全局的SpringMVC的相关属性,采用JAVABean的方式来代替传统的XML配置文件,提供了跨域设置、静态资源处理器、类型转化器、自定义拦截器、页面跳转等能力。

WebMvcConfigurationSupport是webmvc的配置类,如果在springboot项目中,有配置类继承了WebMvcConfigurationSupport,那么webmvc的自动配置类WebMvcAutoConfiguration就会失效

两者都是Spring MVC中的组件,具体的区别如下:

  • 实现方式不同

WebMvcConfigurer:是一个接口,它提供了多个回调方法,可以用于自定义Spring MVC的配置(如消息转换器、拦截器等)。在使用时只需要实现该接口,重写其中的方法即可。

WebMvcConfigurationSupport:是一个抽象类,它也提供了多个回调方法,用于自定义Spring MVC的配置,但是需要继承该类并重写其中的方法。

  • 作用不同

WebMvcConfigurer:

主要用于添加或修改Spring MVC的配置,如添加拦截器,自定义消息转换器等。

WebMvcConfigurationSupport:

主要用于完全自定义Spring MVC的配置,如果需要对Spring MVC的配置进行大量的自定义,可以选择继承该类并重写其中的方法。但是需要注意的是,继承该类会覆盖Spring MVC的部分默认配置。因此,当只需要对部分配置进行自定义时,应该使用WebMvcConfigurer。

  • 继承关系不同

WebMvcConfigurer:

没有继承关系,我们只需要实现该接口即可使用。

WebMvcConfigurationSupport:

是一个抽象类,需要继承后才能使用。

在日常开发中推荐优先使用WebMvcConfigurer的方式(官方推荐),简单方便,也没有特别复杂的定制需求;若我们项目中使用的MVC存在着更加复杂的配置需求推荐WebMvcConfigurationSupport,通过继承此类,可以对官方的MVC代码进行重写操作,但是因为其配置量较大,实现比较复杂,因此在日常开发中使用WebMvcConfigurationSupport并不常见。

格式化的方法

其实,在该项目中,WebMvcConfigurationSupport已经用过多次了,定义了一个子类WebMvcConfiguration继承了WebMvcConfigurationSupport。之前实现了注册自定义拦截器、接口文档(通过knife4j生成接口文档以及设置静态资源映射)。

现在要扩展SpringMVC的消息转换器,统一对日期类型进行格式处理。

首先,新建一个对象映射器子类JacksonObjectMapper继承ObjectMapper。

对象映射器是指:基于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";
    // 定义常量,指定DATE_TIME的格式
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
}

然后,在WebMvcConfiguration中加入自定义的Spring MVC消息转换器,消息转换器中设置对象映射器为上述子类对象:

/**
* 扩展Spring MVC框架的消息转化器
* @param converters 消息转换容器
*/
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters){
    log.info("扩展消息转换器...");
    // 创建一个消息转换器对象
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    // 为消息转换器设置一个对象映射器,对象映射器可以指定序列化的规则
    converter.setObjectMapper(new JacksonObjectMapper());
    // 将自定义的消息转换器加入到容器中
    converters.add(0, converter);
}

再次启动,可以看到调试信息:

com.sky.config.WebMvcConfiguration       : 开始注册自定义拦截器...
com.sky.config.WebMvcConfiguration       : 扩展消息转换器...
o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
com.sky.SkyApplication                   : Started SkyApplication in 1.339 seconds (JVM running for 1.786)
com.sky.SkyApplication                   : server started

信息更新

@Override
public void startOrStop(Integer status, Long id) {
    // 更改用户的账号权限本质上还是对数据做update
    // 因此对加了@Builder注解的Employee做链式创建对象,调用通用的update mapper
    Employee employee = Employee.builder()
            .status(status)
            .id(id)
            .build();
    employeeMapper.update(employee);
}
<update id="update">
    update employee
    <set>
        <if test="name != null and name !=''">name = #{name},</if>
        <if test="username != null and username != ''">username = #{username},</if>
        <if test="password != null and password != ''">password = #{password},</if>
        <if test="phone != null and phone != ''">phone = #{phone},</if>
        <if test="sex != null and sex != ''">sex = #{sex},</if>
        <if test="idNumber != null and idNumber != ''">id_number = #{idNumber},</if>
        <if test="updateTime != null">update_time = #{updateTime},</if>
        <if test="updateUser != null and updateUser != ''">update_user = #{updateUser},</if>
        <if test="status != null">status = #{status},</if>
    </set>
    where id = #{id}
</update>

基础中的基础:if标签中的SQL语句后别忘了加逗号

posted @ 2025-04-25 23:07  subeipo  阅读(33)  评论(0)    收藏  举报