欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

基于SpringBoot项目遇到的坑--Date入参问题

程序员文章站 2022-03-06 23:15:42
目录springboot date入参问题1.传输中的date类型时间不准确springboot date入参问题springboot项目遇到的坑-----使用@responsebody @reque...

springboot date入参问题

springboot项目遇到的坑-----使用@responsebody @requestbody,对象date 类型入参,返回json格式化

1.传输中的date类型时间不准确

时区会有8个小时偏差

原因分析

而springboot默认的是jackson框架转换,而jackson默认的时间时区是gmt,对于中国时间少8个小时

解决方案

在传输的date属性字段上加此注解

@jsonformat(timezone = “gmt+8”,pattern = “yyyy-mm-dd”)

在传输实体类中定义一个long型成员变量存储时间戳 传输过程中只传时间戳 后台将其进行转换为date然后赋值

   class test{
		private date time;
		private long timelong;
   }
   
   @postmapping("/test")
   public test test(@requestbody test test){
       test.settime(new date(test.gettimelone()));
       return test;
   }

2.后台返回的json数据

其中date类型接收会自动转换成long类型的时间戳

基于SpringBoot项目遇到的坑--Date入参问题

原因分析:

springboot1.x版本默认的json处理是jackson 会将date字段返回时间戳

解决方案:

全局配置

spring:  
 jackson:
   time-zone: gmt+8
   date-format: yyyy-mm-dd hh:mm:ss

如果个别实体需要使用其他格式的 pattern,在实体上加入注解即可

@jsonformat(timezone = “gmt+8”,pattern = “yyyy-mm-dd”)
private date time;

基于SpringBoot项目遇到的坑--Date入参问题

springboot接口入参的一些问题

最近在工作中遇到一个接口入参类型转换错误未被处理的问题,于是整理了一些关于springmvc入参的问题

入参绑定

1、入参中我们最常见的是date类型的参数转换,这个可以通过注解来实现参数类型的转换,只需在bean对象的属性上方添加注解@datetimeformat(pattern=“yyyy-mm-dd”),pattern为时间对象的格式化

基于SpringBoot项目遇到的坑--Date入参问题

2、在controller类里定义数据绑定类

/**
     * 在controller层中加入一段数据绑定代码
     * @param webdatabinder
     */
    @initbinder
    public void initbinder(webdatabinder webdatabinder) throws exception{
        simpledateformat simpledateformat = new simpledateformat("yyyy-mm-dd");
        simpledateformat.setlenient(false);
        webdatabinder.registercustomeditor(date.class , new customdateeditor(simpledateformat , true));
    }

3、定义全局的参数类型转换器

首先建立一个实现converter的转换器

 public class dateconverter implements converter<string,date> {
     private simpledateformat simpledateformat = new simpledateformat("yyyy-mm-dd hh:mm:ss");
     @override
     public date convert(string s) {
         if ("".equals(s) || s == null) {
            return null;
         }
         try {
            return simpledateformat.parse(s);
         } catch (parseexception e) {
             e.printstacktrace();
         }
         return null;
     }
 }

然后将该参数转换器绑定到springmvc的配置中

@configuration
public class webconfigbeans {
    @autowired
    private requestmappinghandleradapter handleradapter;
    /**
     * 增加字符串转日期的功能
     */
    @postconstruct
    public void initeditableavlidation() {
        configurablewebbindinginitializer initializer = (configurablewebbindinginitializer)handleradapter.getwebbindinginitializer();
        if(initializer.getconversionservice()!=null) {
            genericconversionservice genericconversionservice = (genericconversionservice)initializer.getconversionservice();           
            genericconversionservice.addconverter(new stringtodateconverter());
        }
    }
}

入参错误全局异常处理

在springmvc的模型中,若参数转换出现异常,会直接跳转到默认的错误400页面,如果我们做的为接口,需返回一个代表错误的json对象时,我们可以使用一个全局的异常处理类,类上添加注解@restcontrolleradvice使得异常处理后返回rest风格的对象,使用@controlleradvice返回页面

@restcontrolleradvice
public class controlleradvice  {
@exceptionhandler(value = {org.springframework.validation.bindexception.class})
    public baseresp dealdatefarmatexception(throwable exception) {
        baseresp resp = new baseresp();
        resp.setcode("400");
        resp.setstatus(false);
        resp.setmsg("参数类型错误");
        return resp;
    }
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。