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语句后别忘了加逗号

浙公网安备 33010602011771号