Required request parameter ‘xxxx‘ for method parameter type Date is present but converted to null
问题
前端请求字段中含时间戳数据
请求报错如下:
[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相关推荐
- MissingServletRequestParameterException: Required request parameter ‘id‘ for method parameter type I
1.报错信息 1.1idea中报错信息 Resolved [org.springframework.web.bind.MissingServletRequestParameterException: ...
- Required request parameter ‘userId‘ for method parameter type String is not present
postman:发送Http请求 springboot控制台打印Exception:Required request parameter 'userId' for method parameter t ...
- 【异常】Required request parameter ‘xxx‘ for method parameter type xxxx is not present
一 .需求描述 前端需要传年份,后端根据年份(year字段)查询对应的结果 二 .代码实现 实现方式,主要有三种方法, (1)使用Get请求+@PathVariable("")的方 ...
- SpringBoot: xxxx for method parameter type String is not present]
对于方法parameter的String类型参数xxxx不存在 首先检查了这个参数xxxx所在代码块. 发现问题是因为session.setAttribute后,没有用request.getSessi ...
- Missing URI template variable 'XXXX' for method parameter of type String
原因:就是spring的controller上的@RequestMapping的实参和方法里面的形参名字不一致 方法:改成一样就可. ps.还能用绑定的方法,不建议,因为太麻烦了 @RequestMa ...
- 前端笔记-thymeleaf获取及回显input标签type=date
这是前端回显的数据: 修改界面: 前端相关代码: <div class="form-group"><label>出生时间</label>< ...
- 错误:Parameter 0 of method sqlSessionFactory in MyBatisConfig required a bean of type ‘javax.sql.DataS
SpringBoot启动错误: *************************** APPLICATION FAILED TO START ***************************D ...
- springboot启动报错Parameter 0 of method a in com.* required a bean of type 'java.lang.String' that could
springboot服务启动报错,报错信息如下 *************************** APPLICATION FAILED TO START ******************** ...
- 报错, 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 ...
最新文章
- 50个jQuery插件可将你的网站带到另一个高度
- Vista上远程管理Hyper-V服务器
- 为什么程序员发现不了自己的BUG
- 1007. 素数对猜想
- 人工智能自拍之后,会怎样给自己P图?
- oracle 不认exp指令,更改oracle字符集导致exp命令出错(解决方法)
- Python 字典 dict() 函数
- JS魔法堂:浏览器模式和文档模式怎么玩?
- netkit-ng安装使用
- 珍藏 | 近200篇机器学习与深度学习经典论文整理
- Google Maps真正离线地图包
- 使用iptables+脚本实现只允许中国IP访问服务器
- 点击电脑版微信一直打不开解决方案
- php-redis常用操作
- git(2)Git 基础
- element方法的自定义参数传参方式
- B. Dubious Cyrpto
- java 对汉字(中文)的汉语拼音(发音)进行排序工具类(代码实现)
- 项目名前有个红色感叹号的解决办法
- 全局快门和卷帘快门(Global shutter and Rolling shutter)