好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

SpringBoot Date入参问题

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

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

时区会有8个小时偏差

原因分析

而SpringBoot默认的是Jackson框架转换,而Jackson默认的时间时区是GMT,对于中国时间少8个小时

解决方案

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

?

1

@JsonFormat (timezone = [GMT+ 8 ],pattern = [yyyy-MM-dd])

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

?

1

2

3

4

5

6

7

8

9

10

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字段返回时间戳

解决方案:

全局配置

?

1

2

3

4

spring: 

  jackson:

    time-zone: GMT+ 8

    date-format: yyyy-MM-dd HH:mm:ss

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

?

1

2

@JsonFormat (timezone = [GMT+ 8 ],pattern = [yyyy-MM-dd])

private Date time;

springboot接口入参的一些问题

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

入参绑定

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

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

?

1

2

3

4

5

6

7

8

9

10

/**

      * 在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的转换器

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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的配置中

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

@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返回页面

?

1

2

3

4

5

6

7

8

9

10

11

@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;

     }

     }

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

原文链接:https://blog.csdn.net/weixin_42413097/article/details/95732864

查看更多关于基于SpringBoot项目遇到的坑--Date入参问题的详细内容...

  阅读:15次