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

 更新时间:2021年10月25日 10:51:22   作者:杀猪了  
这篇文章主要介绍了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;
    }
    }

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

相关文章

  • 使用Java实现一个不同难度(高、中、低)的猜数字游戏

    使用Java实现一个不同难度(高、中、低)的猜数字游戏

    本文介绍了一个增强版的猜数字游戏,包括菜单打印、游戏维持、逻辑功能选择和源代码展示,游戏通过随机数生成和逻辑判断来维持游戏进程,用户可以选择不同的难度,源代码展示了如何实现这三种不同难度的猜数字游戏,为玩家带来更多挑战和乐趣,需要的朋友可以参考下
    2024-09-09
  • hibernate 常用方法介绍

    hibernate 常用方法介绍

    这篇文章介绍了hibernate的常用方法,有需要的朋友可以参考一下
    2013-09-09
  • MyBatis-Plus里面的增删改查详解(化繁为简)

    MyBatis-Plus里面的增删改查详解(化繁为简)

    这篇文章主要给大家介绍了关于MyBatis-Plus里面的增删改查的相关资料,Mybatis-Plus是一个基于Mybatis的增强工具,可以简化Mybatis的开发,提高开发效率,需要的朋友可以参考下
    2023-07-07
  • 聊聊Spring AOP @Before @Around @After等advice的执行顺序

    聊聊Spring AOP @Before @Around @After等advice的执行顺序

    这篇文章主要介绍了聊聊Spring AOP @Before @Around @After等advice的执行顺序,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java使用CountDownLatch实现统计任务耗时

    Java使用CountDownLatch实现统计任务耗时

    这篇文章主要为大家详细介绍了Java如何使用CountDownLatch实现统计任务耗时的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-06-06
  • 减小Maven项目生成的JAR包体积实现提升运维效率

    减小Maven项目生成的JAR包体积实现提升运维效率

    在Maven构建Java项目过程中,减小JAR包体积可通过排除不必要的依赖和使依赖jar包独立于应用jar包来实现,在pom.xml文件中使用<exclusions>标签排除不需要的依赖,有助于显著降低JAR包大小,此外,将依赖打包到应用外,可减少应用包的体积
    2024-10-10
  • 浅析 Java多线程

    浅析 Java多线程

    这篇文章主要介绍了Java多线程的相关资料,帮助大家更好的理解和学习Java线程相关知识,感兴趣的朋友可以了解下
    2020-09-09
  • 使用Java实现压缩图片,视频和音频

    使用Java实现压缩图片,视频和音频

    在 Java 中,要实现视频压缩通常需要使用外部的库或工具,下面就跟随小编一起来看看如何利用这些库实现压缩图片,视频和音频功能吧
    2024-03-03
  • java集合框架线程同步代码详解

    java集合框架线程同步代码详解

    这篇文章主要介绍了java集合框架线程同步代码详解,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Spring中Bean命名的方式总结

    Spring中Bean命名的方式总结

    在 Spring 框架中,每个 bean 必须至少有一个唯一的名称,这篇文章主要为大家详细介绍了Spring中Bean命名的各种方式,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12

最新评论