关于Spring MVC对非String类型进行校验时的出错处理 我在对Userage (Integer型)进行校验时如果输入的是字符总是出错: Failed to convert property value of type [javalangString] to required type [javalangInteger] for property age; nested exception is javalangNumberFormatException: For input string: ff 解决方法: 本例用的是commonsvalidator的开源框架 在Controller中加 protected void initBinder(HttpServletRequest request ServletRequestDataBinder binder) { binderregisterCustomEditor(Integerclass nullnew CustomNumberEditor(Integerclass null true)); binderregisterCustomEditor(Longclass nullnew CustomNumberEditor(Longclass null true)); binderregisterCustomEditor(byte[]classnew ByteArrayMultipartFileEditor()); SimpleDateFormat dateFormat = new SimpleDateFormat(getText(dateformat requestgetLocale())); dateFormatsetLenient(false); binderregisterCustomEditor(Dateclass nullnew CustomDateEditor(dateFormat true)); } 在资源文件ApplicationResources_zh_CNproperties 中加: userage=\ue\uf typeMismatchjavalangInteger={}\ufc\ub\uea\ue\u\uc\u 一些朋友说在用非对象类型如int时也总是出错但我在测试时发现不管是用int 还是用float如果不输或输入字符系统均会自动赋值 int为float为 以下是一个不错的入门文章转发于 jamyy的专栏:
关于Spring中Commons Validator的使用说明 spring的validate验证需要两个bean(ValidatorFactoryBeanValidator)及两xml文件(validatorrulesxmlvalidationxml)的支持ValidatorFactory用于制造BeanValidator后者则是在程序中执行校验的控制beanValidatorrulesxml中定义了各种验证的规则如字段不为空字段输入值必须为整数等等Validationxml中则定义了那些bean及bean中的哪些属性字段需要验证使用哪些验证规则validate 分为两级验证客户端验证(javascript)和服务器端验证以下是使用validate的步骤 在配置文件中声明ValidatorFactory 和 BeanValidator <beanid=validatorFactory class=omonsvalidatorDefaultValidatorFactory> ① <property name=validationConfigLocations> ② <list> <value>/WEBINF/validatorrulesxml</value> <value>/WEBINF/validationxml</value> </list> </property> </bean> <bean id=beanValidator class=omonsvalidatorDefaultBeanValidator> ③ <property name=validatorFactory> <ref bean=validatorFactory />④ </property> </bean> ① 声明validatoFactory这里我们使用spring 的DefaultValidatorFactory ② 定义其validationConfigLocations属性将validatorrulesxml和validationxml传入 ③ 声明beanValidator这里我们使用spring的DefaultBeanValidator ④ 在其属性中指明要使用的validatorFactory这里我们使用刚刚定义的validatorFactory 在需要进行验证的controller(即要使用form表单或者command的controller)中声明validate <beanid=xxxxController ……> <property name=commandName value=userCommand/>① <property name=commandClass value=comresoftUser/> ② <property name=validator ref=beanValidator/> ③ …… </bean> ① commandName用于指明需要验证的 command的名字这个名字必须和 validationxml中<formname= xxxxx > 所写的名字保持一致 ② commandClass用于指定这个command的类型其必须与你jsp提交的form最后形成的command类型相一致 ③ 声明该controller使用validator这里将我们刚刚定义的beanValidator传入进去 在validationxml文件中定义你要校验的formbean(或者说是command)定义这个bean中有哪几个field需要验证使用何种规则验证(注意这里定义的form name 必须和前面controller中定义的commandName保持一致)以下是几种常用的验证示例 <formvalidation> <formset> <form name= userCommand > ① <field property=userId depends=required> ② <arg key=用户代码 /> ③ </field> ① 这里是定义要验证的bean的名字要求去上面定义的commandName相同 ② 这里定义要验证的bean属性为userId使用规则为required(不为空) ③ 这里定义的是显示信息arg表示位置 的显示信息显示key 所标明的信息(如果你还有多个信息就用 argarg 等)出错信息将会显示为用户代码不能为空 <field property=age depends=requiredintegermask> ① <arg key=年龄 /> <msgname=mask key=errorsnegative/> ② <var> <varname>mask</varname> <varvalue>^[]</varvalue>③ </var> </field> ① mask 标记验证使用正则表达式来约束表单输入值(如只能输入数字字母或指定的字符) ② msg标签用来定义验证规则和出错信息的关联这里表示当出现 mask 校验失败时显示 errorsnegative指明的信息 ③ 整个<var>标签就是用来定义具体的规则的如<varname>mask</varname>指明是用于mask的规则<varvalue>^[]</varvalue> 表示只允许这几个数字开头 所以上面验证信息是年龄字段不可以为空必须为整数而且必须为开头也就杜绝了负数和零的情况 <field property=birthday depends=requireddate>① <arg key=生日 /> <var> <varname>datePatternStrict</varname>② <varvalue>yyyyMMdd</varvalue>③ </var> </field> </formset> ① 使用date加入对日期的格式的校验 ② 开始定义日期格式varname必须写为datePatternStrict ③ 定义你希望的日期格式如yyyymmddyy/mm/dd 等等都可以 <field property=startDate depends=requireddate> <arg key=开始日期 /> <var> <varname>datePatternStrict</varname> <varvalue>yyyyMMdd</varvalue> </var> </field> <field property=endDate depends=requireddatecompareTwoField> ① <arg key=结束日期 /> <arg key=开始日期 /> ② <var> <varname>datePatternStrict</varname> <varvalue>yyyyMMdd</varvalue> </var> <var> <varname>secondField</varname>③ <varvalue>startDate</varvalue> </var> </field> ① 这里演示的是两个日期的验证要达到开始日期不能晚于结束日期加入compareTwoField验证规则 ② 定义第个显示参数agr开始日期 ③ 加入一个var其varname为secondField(这个是在程序中写死的必须写为secondField) ④ varvalue定义为开始日期的属性名如在本例中为 startDate 注compareTwoField 是我们自己编写的一个校验规则用于比较两个字段值大小 在jsp页面中定义错误信息显示语句 <spring:bindpath=tableCrashDO*> ① <c:iftest=${not empty statuserrorMessages}> <div class=error> <c:forEachvar=error items=${statuserrorMessages}> <c:outvalue=${error}escapeXml=false/><br/> </c:forEach> </div> </c:if> </spring:bind> ① 这里的path必须要与传入该jsp的bean的名字一样如传入该jsp的数据bean叫tableCrashDOpath就应该写为tableCrashDO* .使客户端产生javascript代码 <v:javascriptformName=tableCrashDO ① staticJavascript=false xhtml=true cdata=false/> <script type=text/javascript src=<c:urlvalue=scripts/validatorjsp/>></script> ① v:javascript标签是spring的标签定义在springcommonsvalidatortld 其中formName必须与validationxml中form的name保持一致 如此以来基本上可以算完成了validate的验证配置 (特别注意 controller 中的commandName validationxml中的form name jsp中v:javascript标签的formName三者必须保持一致) |