基于SpringBoot项目遇到的坑--Date入参问题
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类型的时间戳
原因分析:
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接口入参的一些问题
最近在工作中遇到一个接口入参类型转换错误未被处理的问题,于是整理了一些关于springmvc入参的问题
入参绑定
1、入参中我们最常见的是date类型的参数转换,这个可以通过注解来实现参数类型的转换,只需在bean对象的属性上方添加注解@datetimeformat(pattern=“yyyy-mm-dd”),pattern为时间对象的格式化
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; } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
下一篇: Ireport的安装与使用教程