关于Spring MVC对非String类型进行校验时的出错处理

2 篇文章 0 订阅
 
关于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 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 >
  </ bean >
 
     声明 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"/>   -------
     ……
</bean>
 
     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-validation >
< formset >
< 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 >
        </ field >
 
   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 >
        </ field >
        </ 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 >
       </ field >
 
         这里演示的是两个日期的验证,要达到开始日期不能晚于结束日期,加入 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 >
</ spring:bind >
 
      这里的 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三者必须保持一致。)
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值