SpringBoot中使用Date或LocalDateTime的处理方式

编程

原理

依靠Spring Boot面向切面编程的原理,在POJO类中的Date(或LocalDateTime)属性上,添加注解是利用了切面编程的原理。

添加样例:

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")

@JsonFormatpattern="yyyy-MM-dd",timezone = "GMT+8")

@DateTimeFormat作用

这个注解来自Spring,作用是注解格式化参数,在form表单提交的时候能将对应的字符串转成日期类型。

前台传递给后台的时间格式一致的问题。

实现对应字符串转换成相应日期类型(如Date或LocalDateTime)的功能,采用Spring切面编程的方式来实现,如果前端传递的参数和实体类上说明的参数不一致,或不满足其他要求,比如格式或字符长短的限制(如@NotBlank(message = "{required}"),@Size(min = 4, max = 20, message = "{range}"),@Pattern(regexp = RegexpConstant.MOBILE_REG, message = "{mobile}")等)。

@JsonFormat也能将入参(如startTime)转换为 Date 类型,前提是 前端Content-Type 为application/json的请求;如果是表单请求,请采用@DateTimeFormat。

实现原理

  1. 请求参数的名称以及值封装为MutablePropertyValues对象。
  2. 获取ConfigurablePropertyAccessor配置属性访问类,根据MutablePropertyValues对象生成PropertyValue对象集合。
  3. 遍历PropertyValue对象集合,执行设置操作。
  4. 为每个请求参数生成BeanPropertyHandlerBea属性处理器对象。
  5. 获取请求参数上的注解信息,并生成TypeDescriptor(含有注解信息)。
  6. 根据生成的TypeDescriptor类型描述器对请求参数进行转化,随后利用反射机制执行参数的set方法,从而对参数进行赋值。

@JsonFormat作用

这个注解来自jackson,作用是出参格式化,如我们数据库中存的Date类型的数据,直接取出来时格式不符合要求,@JsonFormat就能解决这个问题。

后台到前台时间格式保持一致的问题。

实现原理

  1. 在AbstractMessageConverterMethodArgumentResolver#readWithMessageConverters(HttpInputMessage, MethodParameter,Type)读取请求参数的值时,调用AbstractJackson2HttpMessageConverter#canRead(Type, Class<?>, MediaType)方法,对每个请求参数生成MethodPropery对象,该对象包括参数名称,参数类型,注解信息,反序列化器等信息。

  2. 接着AbstractJackson2HttpMessageConverter#read方法,通过MethodPropery对象信息,对参数的值进行转化,并使用反射对请求参数进行赋值。

补充:JSONField

JSONField来源于fastjson,是阿里巴巴的开源框架,主要进行JSON解析和序列化。

用法:目前最长的用属性是@JSONField(name=”resType”)和 @JSONField(format=”yyyy-MM-dd”)

name:@JSONField(name=”resType”)主要用于指定前端传到后台时对应的key值,如果bean中没有这个注解,则默认前端传过来的key是field本身,即如果是private String name,name前端对应的key就是name才能对应上。

format @JSONField(format=”yyyy-MM-dd”)主要用于格式化日期,比如前台传过来的时间是2018-07-12 17:44:08,但是通过这个注解,你存到数据库的时间就是2018-07-12 00:00:00。

以上是局部配置方式,即只对该字段有效,也有全局配置的方式,不过会影响效率。

以上是 SpringBoot中使用Date或LocalDateTime的处理方式 的全部内容, 来源链接: utcz.com/z/511249.html

回到顶部