java接口传date类型数据_springboot接收Date类型数据异常与解决办法

在默认情况下,不加任何有关接收Date类型数据的配置时,前端传递Date类型数据至后端接口,控制台出现以下异常:

Failed to convert from type [java.lang.String] to type [java.util.Date] for value

'2333333333'; nested exception is java.lang.IllegalArgumentException]]

复制代码

也就是说,在 SpringBoot

中,必须添加某种配置才能让前端正确传递时间类型数据到后端。下面针对不同的情况来介绍一下解决办法。

局部配置——使用 @DateTimeFormat

第一种情况,仅需要对某个Bean类的Date类型字段进行转换,那么只需要在Bean类属性上增加 @DateTimeFormat()

注解,括号内 pattern

为前端传递的日期格式。比如:

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")

Date createTime;

复制代码

特点--缺陷:

按照如上配置,只能处理形如: 2018-11-2 2:22:2

这样固定格式的数据,无法处理时间戳和 2018-11-2

格式的数据。如果想要处理 2018-11-2

这样的时间,就必须把 pattern

改成 yyyy-MM-dd

可以对不同的属性赋予不同的 pattern

,但是对每个Date类型都要加上注解显得比较繁琐,也无法处理单个属性可能对应不同格式的值的情况。

更通用、有效的方式是定义一个时间转换类,并将其应用到所有的接口上。

全局配置——自定义时间转换器

分为两个步骤:

编写一个时间转换类,把可能的格式转换为Date类型

通过某种方式,将时间转换应用到Spring的所有接口上

时间转换类

import org.springframework.core.convert.converter.Converter;

import org.springframework.util.StringUtils;

import java.text.SimpleDateFormat;

import java.util.Date;

/**

* 日期转换类

* 将标准日期、标准日期时间、时间戳转换成Date类型

*/

public class DateConverter implements Converter {

private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";

private static final String shortDateFormat = "yyyy-MM-dd";

private static final String timeStampFormat = "^\\d+$";

@Override

public Date convert(String value) {

if(StringUtils.isEmpty(value)) {

return null;

}

value = value.trim();

try {

if (value.contains("-")) {

SimpleDateFormat formatter;

if (value.contains(":")) {

formatter = new SimpleDateFormat(dateFormat);

} else {

formatter = new SimpleDateFormat(shortDateFormat);

}

return formatter.parse(value);

} else if (value.matches(timeStampFormat)) {

Long lDate = new Long(value);

return new Date(lDate);

}

} catch (Exception e) {

throw new RuntimeException(String.format("parser %s to Date fail", value));

}

throw new RuntimeException(String.format("parser %s to Date fail", value));

}

}

复制代码

将时间转换类应用到接口上

介绍两种方式:使用 @Component

+ @PostConstruct

或 @ControllerAdvice

+ @InitBinder

第一种方式:

@Component

+ @PostConstruct

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.core.convert.support.GenericConversionService;

import org.springframework.stereotype.Component;

import org.springframework.web.bind.support.ConfigurableWebBindingInitializer;

import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;

import javax.annotation.PostConstruct;

/**

* @author zfh

* @version 1.0

* @date 2018/12/30 10:16

*/

@Component

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 DateConverterConfig());

}

}

}

复制代码

第二种方式:

@ControllerAdvice

+ @InitBinder

import com.aegis.config.converter.DateConverter;

import com.aegis.model.bean.common.JsonResult;

import org.springframework.core.convert.support.GenericConversionService;

import org.springframework.http.HttpStatus;

import org.springframework.web.bind.WebDataBinder;

import org.springframework.web.bind.annotation.*;

/**

* @author zfh

* @version 1.0

* @since 2019/1/4 15:23

*/

@ControllerAdvice

public class ControllerHandler {

@InitBinder

public void initBinder(WebDataBinder binder) {

GenericConversionService genericConversionService = (GenericConversionService) binder.getConversionService();

if (genericConversionService != null) {

genericConversionService.addConverter(new DateConverter());

}

}

}

复制代码

OK,关于SpringBoot处理前端日期传值的问题的相关解决办法就介绍到这里了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值