SpringMVC表单提交错误400排查思路及解决方案

Posted by Naah on Thursday, May 11,2017 09:20:02

前几天在做某一项目时提交表单发现400错误,

如下图所示:

然而根据描述根本无法发现错误所在,于是我对20多个表单项逐一排查,发现!根本就是大海捞针!

于是针对这个错误,检查多次后还是一无所获,于是强行度娘一波,然而并无所获。

最后发现一个帖子提供了一个思路就是将springMVC的日志级别调成DEBUG,瞬间感觉思路清晰了很多。

1 思路排查

首先将log4j的jar包导入项目 [点我下载jar]( “log4j”),

然后再classpath下建立log4j.properties文件,将下列代码复制到文件中,

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %5p %c{1}:%L - %m%n

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=${catalina.home}/logs/ddoMsg.log
log4j.appender.file.MaxFileSize=1024KB
log4j.appender.file.MaxBackupIndex=100
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern= %d{yyyy-MM-dd HH:mm:ss} %5p %c %t: - %m%n

#INFO WARN ERROR DEBUG
log4j.rootLogger=WARN, file, stdout
org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
log4j.logger.org.springframework=DEBUG
log4j.logger.com.jason.ddoMsg=debug

然后重启项目,尽量使用debug模式进行调试项目,

重新提交表单,观察控制台信息。

Field error in object 'foreignerinfo' on field 'passportIssue': rejected value [1]; codes [typeMismatch.foreignerinfo.passportIssue,typeMismatch.passportIssue,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [foreignerinfo.passportIssue,passportIssue]; arguments []; default message [passportIssue]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'passportIssue'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type java.util.Date for value '1'; nested exception is java.lang.IllegalArgumentException: Unable to parse '1']
  2017-05-11 20:43:36,952 DEBUG ResponseStatusExceptionResolver:132 - Resolving exception from handler [public java.lang.String com.naah.controller.Continue.Table.ForeignerInfoTable.Ins(com.naah.PO.Foreignerinfo,com.naah.PO.Visa,com.naah.PO.Whereabouts,javax.servlet.http.HttpSession)]: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors

观察错误信息发现是数据绑定日期转换错误

此时的问题已浮现出来!这种分析问题的思路很棒!

因为是在一星期前看到的博客,今天在历史记录里已经找不到原地址,所以没办法提供原址,抱歉!

2 解决问题

既然问题找到了,那么下面就来解决一下这个问题!

既然是格式转换错误,我到表单内看了一眼,

发现这个表单我提交了空值,而空值转换为date类型会报错!

度娘了一下SpringMVC日期转换的问题,网上推荐重写springMVC的日期转换方法,

在这里我使用的是更改controller 独享方式,而并没有使用全局方式。

在对应的controller中填写以下方法:

@InitBinder
	public void initBinder(WebDataBinder binder)
	{
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		dateFormat.setLenient(false);
		binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
	}

将 new CustomDateEditor(dateFormat, true));的布尔值设置为true:允许输入空值,false:不能为空值;

表单再次提交,发现错误解决!

本文参考该链接SpringMvc 数据绑定400错误