关于Spring MVC对非String类型进行校验时的出错处理
我在对User.age (Integer型),进行校验时,如果输入的是字符总是出错:
Failed to convert property value of type [java.lang.String] to required type [java.lang.Integer] for property age; nested exception is java.lang.NumberFormatException: For input string: "ff"
解决方法:
1.本例用的是commons-validator的开源框架
2.在Controller中加
protected void initBinder(HttpServletRequest request,
ServletRequestDataBinder binder) {
binder.registerCustomEditor(Integer.class, null,new CustomNumberEditor(Integer.class, null, true));
binder.registerCustomEditor(Long.class, null,new CustomNumberEditor(Long.class, null, true));
binder.registerCustomEditor(byte[].class,new ByteArrayMultipartFileEditor());
SimpleDateFormat dateFormat = new SimpleDateFormat(getText("date.format", request.getLocale()));
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, null,new CustomDateEditor(dateFormat, true));
}
3.在资源文件ApplicationResources_zh_CN.properties 中加:
user.age=
/u5e74/u9f84
typeMismatch.java.lang.Integer=
{0}
/u5fc5/u987b/u4e3a/u4e00/u6570/u503c/u3002
4.一些朋友说在用非对象类型如int时也总是出错,但我在测试时发现不管是用int 还是用float,如果不输或输入字符,系统均会自动赋值 int为0,float为0.0
5.以下是一个不错的入门文章,转发于” jamyy2000的专栏”:
关于Spring中Commons Validator的使用说明
spring
的
validate
验证需要两个
bean
(
ValidatorFactory
、
BeanValidator
)及两
xml
文件(
validator-rules.xml
、
validation.xml
)的支持,
ValidatorFactory
用于制造
BeanValidator
,后者则是在程序中执行校验的控制
bean
。
Validatorrules.xml
中定义了各种验证的规则,如字段不为空,字段输入值必须为整数等等。
Validation.xml
中则定义了那些
bean
及
bean
中的哪些属性字段需要验证,使用哪些验证规则。
validate
分为两级验证,客户端验证(
javascript
)和服务器端验证。以下是使用
validate
的步骤:
1.
在配置文件中声明
ValidatorFactory
和
BeanValidator
:
<
bean
id
=
"validatorFactory"
class
=
"org.springmodules.commons.validator.DefaultValidatorFactory"
>
-----
①
<
property
name
=
"validationConfigLocations"
>
-----
②
<
list
>
<
value
>
/WEB-INF/validator-rules.xml
</
value
>
<
value
>
/WEB-INF/validation.xml
</
value
>
</
list
>
</
property
>
</
bean
>
<
bean
id
=
"beanValidator"
class
=
"org.springmodules.commons.validator.DefaultBeanValidator"
>
-------
③
<
property
name
=
"validatorFactory"
>
<
ref
bean
=
"validatorFactory"
/>
--------
④
</
property
>
①
声明
validatoFactory
这里我们使用
spring
的
DefaultValidatorFactory
②
定义其
validationConfigLocations
属性,将
validator-rules.xml
和
validation.xml
传入
③
声明
beanValidator
这里我们使用
spring
的
DefaultBeanValidator
④
在其属性中指明要使用的
validatorFactory
。这里我们使用刚刚定义的
validatorFactory
2.
在需要进行验证的
controller
(即要使用
form
表单或者
command
的
controller
)中声明
validate
。
<bean
id
="xxxxController" ……>
<property
name="commandName" value="userCommand"/> -----
①
<property
name="commandClass" value="com.resoft.User"/> -----
②
<property
name="validator" ref="beanValidator"/> -------
③
①
commandName
用于指明需要验证的
command
的名字,这个名字必须和
validation.xml
中
<formname=" xxxxx ">
所写的名字保持一致。
②
commandClass
用于指定这个
command
的类型。其必须与你
jsp
提交的
form
最后形成的
command
类型相一致。
③
声明该
controller
使用
validator
,这里将我们刚刚定义的
beanValidator
传入进去。
3.
在
validation.xml
文件中,定义你要校验的
formbean
(或者说是
command
)
,定义这个
bean
中有哪几个
field
需要验证,使用何种规则验证。(注意:这里定义的
form name
必须和前面
controller
中定义的
commandName
保持一致
)以下是几种常用的验证示例:
<
form
name
=
"
userCommand "> -----
①
<
field
property
=
"userId"
depends
=
"required"
> -----
②
<
arg0
key
=
"
用户代码
"
/>
-------
③
</
field
>
①
这里是定义要验证的
bean
的名字,要求去上面定义的
commandName
相同
②
这里定义要验证的
bean
属性为
userId
,
使用规则为
required
(
不为空
)
③
这里定义的是显示信息,
arg0
表示位置
0
的显示信息,显示
key
所标明的信息(如果你还有多个信息就用
arg1
,
arg2
等)出错信息将会显示为:
用户代码不能为空
<
field
property
=
"age"
depends
=
"required,integer,mask"
>
-----
①
<
arg0
key
=
"
年龄
"
/>
<
msg
name
=
"mask"
key
=
"errors.negative"
/>
-----
②
<
var
>
<
var-name
>
mask
</
var-name
>
<
var-value
>
^[1-9]
</
var-value
>
-------
③
</
var
>
①
mask
标记验证,使用正则表达式来约束表单输入值。(如:只能输入数字,字母或指定的字符)
②
msg
标签用来定义验证规则和出错信息的关联,这里表示当出现
mask
校验失败时,显示
errors.negative
指明的信息。
③
整个
<var>
标签就是用来定义具体的规则的,如
<var-name>mask</var-name>
指明是用于
mask
的规则,
<var-value>^[1-9]</var-value>
表示只允许
1-9
这几个数字开头。
所以上面验证信息是年龄字段不可以为空,必须为整数,而且必须为
1-9
开头
也就杜绝了负数和零的情况。
<
field
property
=
"birthday"
depends
=
"required,date"
>
-----
①
<
arg0
key
=
"
生日
"
/>
<
var
>
<
var-name
>
datePatternStrict
</
var-name
>
-----
②
<
var-value
>
yyyy-MM-dd
</
var-value
>
-----
③
</
var
>
</
formset
>
①
使用“
date
”加入对日期的格式的校验
②
开始定义日期格式,
var-name
必须写为
datePatternStrict
③
定义你希望的日期格式如:
yyyy-mm-dd yy/mm/dd
等等都可以。
<
field
property
=
"startDate"
depends
=
"required,date"
>
<
arg0
key
=
"
开始日期
"
/>
<
var
>
<
var-name
>
datePatternStrict
</
var-name
>
<
var-value
>
yyyy-MM-dd
</
var-value
>
</
var
>
</
field
>
<
field
property
=
"endDate"
depends
=
"required,date,compareTwoField"
>
-----
①
<
arg0
key
=
"
结束日期
"
/>
<
arg1
key
=
"
开始日期
"
/>
-----
②
<
var
>
<
var-name
>
datePatternStrict
</
var-name
>
<
var-value
>
yyyy-MM-dd
</
var-value
>
</
var
>
<
var
>
<
var-name
>
secondField
</
var-name
>
-------
③
<
var-value
>
startDate
</
var-value
>
</
var
>
①
这里演示的是两个日期的验证,要达到开始日期不能晚于结束日期,加入
compareTwoField
验证规则
②
定义第
2
个显示参数
agr1
“开始日期”
③
加入一个
var
其
var-name
为
secondField
(这个是在程序中写死的,必须写为
secondField
)
④
var-value
定义为开始日期的属性名,如在本例中为
startDate
注:
compareTwoField
是我们自己编写的一个校验规则,用于比较两个字段值大小。
4.
在
jsp
页面中定义错误信息显示语句:
<
spring:bind
path
=
"tableCrashDO.*"
>
-----
①
<
c:if
test
=
"
${not empty status.errorMessages}">
<
div
class
=
"error"
>
<
c:forEach
var
=
"error"
items
=
"
${status.errorMessages}">
<
c:out
value
=
"
${error}"escapeXml="false"/><br/>
</
c:forEach
>
</
div
>
</
c:if
>
①
这里的
path
必须要与传入该
jsp
的
bean
的名字一样。如传入该
jsp
的数据
bean
叫
tableCrashDO
,
path
就应该写为
tableCrashDO.*
。
5
.使客户端产生
javascript
代码:
<
v:javascript
formName
=
"tableCrashDO"
-----
①
staticJavascript
=
"false"
xhtml
=
"true"
cdata
=
"false"
/>
<
script
type
=
"text/javascript"
src
=
"
<
c:url
value
=
"scripts/validator.jsp"
/>
"
></
script
>
①
v:javascript
标签是
spring
的标签,定义在
spring-commons-validator.tld
。其中
formName
必须与
validation.xml
中
form
的
name
保持一致。
如此以来,基本上可以算完成了
validate
的验证配置。
(特别注意: controller 中的commandName; validation.xml中的form name; jsp中v:javascript标签的formName三者必须保持一致。)