SpringBoot http请求 提交日期参数 转换失败的解决方法 (无法自动转换字符串到日期)
泛域名ssl证书 239元1年送1个月、单域名39元1年,Sectigo(原Comodo证书)全球可信证书,强大的兼容性,高度安全性,如有问题7天内可退、可开发票
加微信VX 18718058521 备注SSL证书
【腾讯云】2核2G4M云服务器新老同享99元/年,续费同价
如果你有类似如下报错信息,可阅读此文尝试解决:
2018-08-18 14:05:17.687 WARN 17100 --- [p-nio-80-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 4 errors Field error in object 'sysUserDO' on field 'userBecomeTime': rejected value []; codes [typeMismatch.sysUserDO.userBecomeTime,typeMismatch.userBecomeTime,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [sysUserDO.userBecomeTime,userBecomeTime]; arguments []; default message [userBecomeTime]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'userBecomeTime'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value ''; nested exception is java.lang.IllegalArgumentException] Field error in object 'sysUserDO' on field 'userBirthday': rejected value []; codes [typeMismatch.sysUserDO.userBirthday,typeMismatch.userBirthday,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [sysUserDO.userBirthday,userBirthday]; arguments []; default message [userBirthday]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'userBirthday'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value ''; nested exception is java.lang.IllegalArgumentException] Field error in object 'sysUserDO' on field 'userDimissionTime': rejected value []; codes [typeMismatch.sysUserDO.userDimissionTime,typeMismatch.userDimissionTime,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [sysUserDO.userDimissionTime,userDimissionTime]; arguments []; default message [userDimissionTime]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'userDimissionTime'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value ''; nested exception is java.lang.IllegalArgumentException] Field error in object 'sysUserDO' on field 'userJoinTime': rejected value []; codes [typeMismatch.sysUserDO.userJoinTime,typeMismatch.userJoinTime,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [sysUserDO.userJoinTime,userJoinTime]; arguments []; default message [userJoinTime]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'userJoinTime'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value ''; nested exception is java.lang.IllegalArgumentException]
前台像后台传递参数带日期是,springboot自动绑定会失败
比如:
前台代码:
后台接收代码:
报错信息:
下面给出解决方法:
1.创建一个class 名称:StringToDateConverter 稍后会用到此类
import org.apache.commons.lang3.StringUtils; import org.springframework.core.convert.converter.Converter; import java.text.SimpleDateFormat; import java.util.Date; public class StringToDateConverter implements Converter<String, Date> { private static final String dateFormat = "yyyy-MM-dd HH:mm:ss"; private static final String shortDateFormat = "yyyy-MM-dd"; private static final String dateFormat2 = "yyyy/MM/dd HH:mm:ss"; private static final String shortDateFormat2 = "yyyy/MM/dd"; @Override public Date convert(String source) { if (StringUtils.isBlank(source)) { return null; } source = source.trim(); try { SimpleDateFormat formatter; if (source.contains("-")) { if (source.contains(":")) { formatter = new SimpleDateFormat(dateFormat); } else { formatter = new SimpleDateFormat(shortDateFormat); } Date dtDate = formatter.parse(source); return dtDate; } else if (source.contains("/")) { if (source.contains(":")) { formatter = new SimpleDateFormat(dateFormat2); } else { formatter = new SimpleDateFormat(shortDateFormat2); } Date dtDate = formatter.parse(source); return dtDate; } } catch (Exception e) { throw new RuntimeException(String.format("parser %s to Date fail", source)); } throw new RuntimeException(String.format("parser %s to Date fail", source)); } }
其中StringUtils为apache lang3包,可以自己手写替代,或导包
<!--apache lang3-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.1</version>
</dependency>
2.添加配置类,把我们写的处理日期的类交给spring,让它知道怎么处理
import com.here.hulk.utils.StringToDateConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.support.GenericConversionService;
import org.springframework.web.bind.support.ConfigurableWebBindingInitializer;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import javax.annotation.PostConstruct;
@Configuration
public class WebAppConfig {
@Autowired
private RequestMappingHandlerAdapter handlerAdapter;
/**
* 此方法解决前台提交的日期参数绑定不正确问题,将自己实现的StringToDateConverter交给spring,让其知道如何进行处理
*/
@PostConstruct //@PostContruct是spring框架的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。 public void initEditableValidation() { ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) handlerAdapter.getWebBindingInitializer(); if (initializer.getConversionService() != null) { GenericConversionService genericConversionService = (GenericConversionService) initializer.getConversionService(); genericConversionService.addConverter(new StringToDateConverter()); } } }
3.重启测试,有问题继续想办法,总是能解决的