SpringBoot下前后台分离时间处理


之前在前后端交互过程中,针对时间类型的字段,在DTO中使用String类型接收,在后台转成Date类型。但这样处理太麻烦。
JDK8的新特性中Time API,其包括ClockDurationInstantLocalDateLocalTimeLocalDateTimeZonedDateTime,这里介绍Spring Boot处理LocalDateTime格式。

Controller接收参数

在Spring中,接收LocalDateTime日期时间数据时,只需要使用@DateTimeFormat注解即可。@DateTimeFormat可以注解在字段、参数以及方法上,如果接收的为DTO,则需要将@DateTimeFormat注解在DTO中的字段上。(注意:前台传的参数格式必须与pattern定义格式一致)

@GetMapping("date")
public Object date(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime date) {
    return date;
}

@GetMapping("date2")
public Object date(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) {
    return date;
}

ResponseBody格式化LocalDateTime

Spring默认使用使用jackson来进行json格式转换。这里需要加入jacksonjsr310扩展包。

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.8.9</version>
</dependency>

使用@JsonFormat注解

public class InfoDTO {

    /**
     * 创建时间
     */
    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createDate;

    //get/set方法省略

}

使用ObjectMapper

使用@Bean注解创建一个ObjectMapperBean,并将JavaTimeModule注册到ObjectMapper中即可,spring会使用该bean创建MappingJackson2HttpMessageConverter进行json格式转换。

@Bean(name = "mapperObject")
@Primary
public ObjectMapper getObjectMapper() {
    ObjectMapper om = new ObjectMapper();
    JavaTimeModule javaTimeModule = new JavaTimeModule();
    javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
    javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
    javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
    om.registerModule(javaTimeModule);
    return om;
}

后续

在使用 @DateFormat进行参数转换的时候,只能接收url参数,或者表单提交参数。如果参数对象是以JSON传递过来的,这时使用该注解就无法进行转化。

@RestController
public class Controller {
    @PostMapping("/")
    public void post(@RequestBody InfoDTO infoDTO) {}
}
public class InfoDTO {

    /**
     * 创建时间
     */
    @JsonDeserialize(using = LocalDateDeserializer.class)
    @JsonFormat(pattern = "yyyyMMdd")
    private LocalDateTime createDate;

    //get/set方法省略

}

文章作者: Niww
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Niww !
 上一篇
Java8中关于日期和时间API的20个使用示例 Java8中关于日期和时间API的20个使用示例
一、前言随着lambda表达式、streams以及一系列小优化,Java8推出了全新的日期时间API,在一下的指南中我们将通过一些简单的示例来学习如何使用新API。Java处理日期、日历和时间的方式一直为社区所诟病,将java.util.D
2018-09-13
下一篇 
SpringCloud客户端FeignClient调用时传递Token SpringCloud客户端FeignClient调用时传递Token
前言Feign是一个声明式WebService客户端。在SpringCloud中可以通过FeignClient来进行服务间的调用。 而为了对API进行权限控制,项目中会进行权限认证,JWT或者Security。这时问题就会出现了,在加了授权
2018-04-17
  目录