问题

前端请求字段中含时间戳数据

请求报错如下:

 [http-nio-9071-exec-2] ERROR c.m.c.s.h.GlobalExceptionHandler - [handleException,62] - Required request parameter 'xxxx' for method parameter type Date is present but converted to null
org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'xxxx' for method parameter type Date is present but converted to nullat org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValueInternal(RequestParamMethodArgumentResolver.java:218)at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValueAfterConversion(RequestParamMethodArgumentResolver.java:200)at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:138)at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:179)at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:146)at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)at javax.servlet.http.HttpServlet.service(HttpServlet.java:645)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1732)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:745)

排查

通过报错得知项目中有参数绑定解析,若无会报String转换Date异常

@InitBinder
public void initBinder(WebDataBinder binder)
{// Date 类型转换binder.registerCustomEditor(Date.class, new PropertyEditorSupport(){@Overridepublic void setAsText(String text){setValue(DateUtils.parseDate(text));}});
}
private static String[] parsePatterns = {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM","yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};public static Date parseDate(Object str)
{if (str == null){return null;}try{return parseDate(str.toString(), parsePatterns);}catch (ParseException e){return null;}
}

解决

方式(1)加入时间戳转换

@InitBinder
public void initBinder(WebDataBinder binder)
{// Date 类型转换binder.registerCustomEditor(Date.class, new PropertyEditorSupport(){@Overridepublic void setAsText(String text){try {setValue(DateUtils.parseDate(text));} catch (ParseException e) {long textLong = Long.parseLong(text);setValue(new Date(textLong));}}});
}

方式(2)日期参数转换器

@Configuration
public class DateConfiguration {@Beanpublic Formatter<Date> localDateFormatter() {return new Formatter<Date>() {@Overridepublic Date parse(String text, Locale locale) throws ParseException {Date d;try {d = DateUtils.parseDateStrictly(text,new String[] {"yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd","yyyy/MM/dd HH:ss:ss", "HH:mm:ss"});} catch (ParseException e) {if (StringUtils.isNotEmpty(text)) {long textLong = Long.parseLong(text);d = new Date(textLong);}else {d = null;}}return d;}@Overridepublic String print(Date date, Locale locale) {return DateFormatUtils.format(date,"yyyy-MM-dd HH:mm:ss");}};}
}

注:若使用了@InitBinder,Spring会优先使用该方式进行处理,即方式(2)不生效,源码如下:

@Nullable
public <T> T convertIfNecessary(@Nullable String propertyName, @Nullable Object oldValue, @Nullable Object newValue, @Nullable Class<T> requiredType, @Nullable TypeDescriptor typeDescriptor) throws IllegalArgumentException {PropertyEditor editor = this.propertyEditorRegistry.findCustomEditor(requiredType, propertyName);ConversionFailedException conversionAttemptEx = null;ConversionService conversionService = this.propertyEditorRegistry.getConversionService();if (editor == null && conversionService != null && newValue != null && typeDescriptor != null) {TypeDescriptor sourceTypeDesc = TypeDescriptor.forObject(newValue);if (conversionService.canConvert(sourceTypeDesc, typeDescriptor)) {try {return conversionService.convert(newValue, sourceTypeDesc, typeDescriptor);} catch (ConversionFailedException var14) {conversionAttemptEx = var14;}}}Object convertedValue = newValue;if (editor != null || requiredType != null && !ClassUtils.isAssignableValue(requiredType, newValue)) {if (typeDescriptor != null && requiredType != null && Collection.class.isAssignableFrom(requiredType) && newValue instanceof String) {TypeDescriptor elementTypeDesc = typeDescriptor.getElementTypeDescriptor();if (elementTypeDesc != null) {Class<?> elementType = elementTypeDesc.getType();if (Class.class == elementType || Enum.class.isAssignableFrom(elementType)) {convertedValue = StringUtils.commaDelimitedListToStringArray((String)newValue);}}}if (editor == null) {editor = this.findDefaultEditor(requiredType);}convertedValue = this.doConvertValue(oldValue, convertedValue, requiredType, editor);}...

Required request parameter ‘xxxx‘ for method parameter type Date is present but converted to null相关推荐

  1. MissingServletRequestParameterException: Required request parameter ‘id‘ for method parameter type I

    1.报错信息 1.1idea中报错信息 Resolved [org.springframework.web.bind.MissingServletRequestParameterException: ...

  2. Required request parameter ‘userId‘ for method parameter type String is not present

    postman:发送Http请求 springboot控制台打印Exception:Required request parameter 'userId' for method parameter t ...

  3. 【异常】Required request parameter ‘xxx‘ for method parameter type xxxx is not present

    一 .需求描述 前端需要传年份,后端根据年份(year字段)查询对应的结果 二 .代码实现 实现方式,主要有三种方法, (1)使用Get请求+@PathVariable("")的方 ...

  4. SpringBoot: xxxx for method parameter type String is not present]

    对于方法parameter的String类型参数xxxx不存在 首先检查了这个参数xxxx所在代码块. 发现问题是因为session.setAttribute后,没有用request.getSessi ...

  5. Missing URI template variable 'XXXX' for method parameter of type String

    原因:就是spring的controller上的@RequestMapping的实参和方法里面的形参名字不一致 方法:改成一样就可. ps.还能用绑定的方法,不建议,因为太麻烦了 @RequestMa ...

  6. 前端笔记-thymeleaf获取及回显input标签type=date

    这是前端回显的数据: 修改界面: 前端相关代码: <div class="form-group"><label>出生时间</label>< ...

  7. 错误:Parameter 0 of method sqlSessionFactory in MyBatisConfig required a bean of type ‘javax.sql.DataS

    SpringBoot启动错误: *************************** APPLICATION FAILED TO START ***************************D ...

  8. springboot启动报错Parameter 0 of method a in com.* required a bean of type 'java.lang.String' that could

    springboot服务启动报错,报错信息如下 *************************** APPLICATION FAILED TO START ******************** ...

  9. 报错, Exception: Missing URI template variable ‘id‘ for method parameter of type Long

    问题: 2021-03-24 17:31:05.391 ERROR 12756 --- [io-12000-exec-2] c.y.w.c.GlobalControllerExceptionHandl ...

最新文章

  1. 50个jQuery插件可将你的网站带到另一个高度
  2. Vista上远程管理Hyper-V服务器
  3. 为什么程序员发现不了自己的BUG
  4. 1007. 素数对猜想
  5. 人工智能自拍之后,会怎样给自己P图?
  6. oracle 不认exp指令,更改oracle字符集导致exp命令出错(解决方法)
  7. Python 字典 dict() 函数
  8. JS魔法堂:浏览器模式和文档模式怎么玩?
  9. netkit-ng安装使用
  10. 珍藏 | 近200篇机器学习与深度学习经典论文整理
  11. Google Maps真正离线地图包
  12. 使用iptables+脚本实现只允许中国IP访问服务器
  13. 点击电脑版微信一直打不开解决方案
  14. php-redis常用操作
  15. git(2)Git 基础
  16. element方法的自定义参数传参方式
  17. B. Dubious Cyrpto
  18. java 对汉字(中文)的汉语拼音(发音)进行排序工具类(代码实现)
  19. 项目名前有个红色感叹号的解决办法
  20. 全局快门和卷帘快门(Global shutter and Rolling shutter)

热门文章

  1. 【AtCoder】【思维】【图论】Splatter Painting(AGC012)
  2. 【Selenium Other】使用quit()无法关闭窗口 一键杀死进程
  3. IntelliJ IDEA查看类层次结构图
  4. 7-40 奥运排行榜(25 分)
  5. 基于Opencv的颜色识别
  6. termux目录_Termux 入门与实践
  7. CVPR 二十年,影响力最大的 10 篇论文
  8. Redis教程(一) Redis入门教程
  9. 移动硬盘无法识别解决办法
  10. ionic3正式发布(ionic2升级到ionic3)