分享

SpringMVC数据验证——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC

 贾朋亮博客 2015-03-19

7.4、数据验证

7.4.1、编程式数据验证

Spring 2.x提供了编程式验证支持,详见【4.16.2 数据验证】章节,在此我们重写【4.16.2.4.1、编程式验证器】一节示例。

 

(1、验证器实现

复制cn.javass.chapter4.web.controller.support.validator.UserModelValidator

cn.javass.chapter7.web.controller.support.validator.UserModelValidator

(2、控制器实现

Java代码  收藏代码
  1. @Controller  
  2. public class RegisterSimpleFormController {  
  3.     private UserModelValidator validator = new UserModelValidator();  
  4.   
  5.     @ModelAttribute("user")        //① 暴露表单引用对象为模型数据  
  6.     public UserModel getUser() {  
  7.         return new UserModel();  
  8.     }  
  9.     @RequestMapping(value = "/validator", method = RequestMethod.GET)  
  10.     public String showRegisterForm() {   //② 表单展示  
  11.         return "validate/registerAndValidator";  
  12.     }  
  13.     @RequestMapping(value = "/validator", method = RequestMethod.POST)  
  14.     public String submitForm(  
  15.             @ModelAttribute("user") UserModel user,  
  16.             Errors errors) {           //③ 表单提交  
  17.         validator.validate(user, errors);  //1 调用UserModelValidator的validate方法进行验证  
  18.         if(errors.hasErrors()) { //2如果有错误再回到表单展示页面  
  19.             return showRegisterForm();  
  20.         }  
  21.         return "redirect:/success";  
  22.     }  
  23. }   

在submitForm方法中,我们首先调用之前写的UserModelValidator的validate方法进行验证,当然此处可以直接验证并通过Errors接口来保留错误;此处还通过 Errors接口的hasErrors方法来决定当验证失败时显示的错误页面。

 

(3、spring配置文件chapter7-servlet.xml

Java代码  收藏代码
  1. <bean class="cn.javass.chapter7.web.controller.RegisterSimpleFormController"/>   

(4、错误码配置(messages.properties),需要执行NativeToAscii

直接将【springmvc-chapter4】项目中src下的messages.properties复制到src目录下。

 

在spring配置文件chapter7-servlet.xml中添加messageSource

Java代码  收藏代码
  1. <bean id="messageSource"   
  2. class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  
  3.         <property name="basename" value="classpath:messages"/>  
  4.         <property name="fileEncodings" value="utf-8"/>  
  5.         <property name="cacheSeconds" value="120"/>  
  6. </bean>   

 

(5、视图页面(/WEB-INF/jsp/registerAndValidator.jsp)

直接将【springmvc-chapter4】项目中的/WEB-INF/jsp/registerAndValidator.jsp复制到当前项目下的/WEB-INF/jsp/validate/registerAndValidator.jsp。

 

(6、启动服务器测试:

在浏览器地址栏输入http://localhost:9080/springmvc-chapter7/validator进行测试,测试步骤和【4.16.2.4.1、编程式验证器】一样。

 

其他编程式验证的使用,请参考【4.16.2 数据验证】章节。

 

7.4.2、声明式数据验证

Spring3开始支持JSR-303验证框架,JSR-303支持XML风格的和注解风格的验证,接下来我们首先看一下如何和Spring集成。

7.4.2.1、集成

(1、添加jar包:

此处使用Hibernate-validator实现(版本:hibernate-validator-4.3.0.Final-dist.zip),将如下jar包添加到classpath(WEB-INF/lib下即可):

 写道
dist/lib/required/validation-api-1.0.0.GA.jar JSR-303规范API包
dist/hibernate-validator-4.3.0.Final.jar Hibernate 参考实现

(2、在Spring配置总添加对JSR-303验证框架的支持   

 

Java代码  收藏代码
  1. <!-- 以下 validator  ConversionService 在使用 mvc:annotation-driven 会 自动注册-->  
  2. <bean id="validator"   
  3. class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">  
  4.         <property name="providerClass"  value="org.hibernate.validator.HibernateValidator"/>  
  5.         <!-- 如果不加默认到 使用classpath下的 ValidationMessages.properties -->  
  6.         <property name="validationMessageSource" ref="messageSource"/>  
  7. </bean>   

此处使用Hibernate validator实现:

validationMessageSource属性:指定国际化错误消息从哪里取,此处使用之前定义的messageSource来获取国际化消息;如果此处不指定该属性,则默认到classpath下的ValidationMessages.properties取国际化错误消息。

 

通过ConfigurableWebBindingInitializer注册validator:

Java代码  收藏代码
  1. <bean id="webBindingInitializer"   
  2. class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">  
  3.         <property name="conversionService" ref="conversionService"/>  
  4.         <property name="validator" ref="validator"/>  
  5. </bean>   

其他配置和之前学习7.2.2.4一节一样。

 

如上集成过程看起来比较麻烦,后边我们会介绍<mvc:annotation-driven>和@EnableWebMvc,ConversionService会自动注册,后续章节再详细介绍。

 

(3、使用JSR-303验证框架注解为模型对象指定验证信息

Java代码  收藏代码
  1. package cn.javass.chapter7.model;  
  2. import javax.validation.constraints.NotNull;  
  3. public class UserModel {  
  4.     @NotNull(message="{username.not.empty}")  
  5.     private String username;  
  6. }   

通过@NotNull指定此username字段不允许为空,当验证失败时将从之前指定的messageSource中获取“username.not.empty”对于的错误信息,此处只有通过“{错误消息键值}”格式指定的才能从messageSource获取。

 

(4、控制器

Java代码  收藏代码
  1. package cn.javass.chapter7.web.controller.validate;  
  2. //省略import  
  3. @Controller  
  4. public class HelloWorldController {  
  5.     @RequestMapping("/validate/hello")  
  6.     public String validate(@Valid @ModelAttribute("user") UserModel user, Errors errors) {  
  7.           
  8.         if(errors.hasErrors()) {  
  9.             return "validate/error";  
  10.         }  
  11.         return "redirect:/success";  
  12.     }  
  13. }   

通过在命令对象上注解@Valid来告诉Spring MVC此命令对象在绑定完毕后需要进行JSR-303验证,如果验证失败会将错误信息添加到errors错误对象中。

 

(5、验证失败后需要展示的页面(/WEB-INF/jsp/validate/error.jsp)

Java代码  收藏代码
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  2. <%@taglib prefix="form" uri="http://www./tags/form" %>  
  3.   
  4. <form:form commandName="user">  
  5.     <form:errors path="*" cssStyle="color:red"></form:errors><br/>  
  6. </form:form>   

(6、测试

在浏览器地址栏中输入http://localhost:9080/springmvc-chapter7/validate/hello,即没有username数据,请求后将直接到验证失败界面并显示错误消息“用户名不能为空”,如果请求时带上“?username=zhang”将重定向到成功页面。

 

到此集成就完成,接下来我们详细学习下有哪些验证约束注解吧。

7.4.2.2、内置的验证约束注解

内置的验证约束注解如下表所示(摘自hibernate validator reference):

验证注解

验证的数据类型

说明

@AssertFalse

Boolean,boolean

验证注解的元素值是false

@AssertTrue

Boolean,boolean

验证注解的元素值是true

@NotNull

任意类型

验证注解的元素值不是null

@Null

任意类型

验证注解的元素值是null

@Min(value=值)

BigDecimal,BigInteger, byte,

short, int, long,等任何Number或CharSequence(存储的是数字)子类型

验证注解的元素值大于等于@Min指定的value值

@Max(value=值)

和@Min要求一样

验证注解的元素值小于等于@Max指定的value值

@DecimalMin(value=值)

和@Min要求一样

验证注解的元素值大于等于@ DecimalMin指定的value值

@DecimalMax(value=值)

和@Min要求一样

验证注解的元素值小于等于@ DecimalMax指定的value值

@Digits(integer=整数位数, fraction=小数位数)

和@Min要求一样

验证注解的元素值的整数位数和小数位数上限

@Size(min=下限, max=上限)

字符串、Collection、Map、数组等

验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小

@Past

java.util.Date,

java.util.Calendar;

Joda Time类库的日期类型

验证注解的元素值(日期类型)比当前时间早

@Future

与@Past要求一样

验证注解的元素值(日期类型)比当前时间晚

@NotBlank

CharSequence子类型

验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的首位空格

@Length(min=下限, max=上限)

CharSequence子类型

验证注解的元素值长度在min和max区间内

@NotEmpty

CharSequence子类型、Collection、Map、数组

验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)

@Range(min=最小值, max=最大值)

BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子类型和包装类型

验证注解的元素值在最小值和最大值之间

@Email(regexp=正则表达式,

flag=标志的模式)

CharSequence子类型(如String)

验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式

@Pattern(regexp=正则表达式,

flag=标志的模式)

String,任何CharSequence的子类型

验证注解的元素值与指定的正则表达式匹配

@Valid

任何非原子类型

指定递归验证关联的对象;

如用户对象中有个地址对象属性,如果想在验证用户对象时一起验证地址对象的话,在地址对象上加@Valid注解即可级联验证

 

此处只列出Hibernate Validator提供的大部分验证约束注解,请参考hibernate validator官方文档了解其他验证约束注解和进行自定义的验证约束注解定义。

 

具体演示实例请参考cn.javass.chapter7.web.controller.validate.ValidatorAnnotationTestController。

7.4.2.3、错误消息

当验证出错时,我们需要给用户展示错误消息告诉用户出错的原因,因此我们要为验证约束注解指定错误消息。错误消息是通过在验证约束注解的message属性指定。验证约束注解指定错误消息有如下两种方式:

1、硬编码错误消息;

2、从资源消息文件中根据消息键读取错误消息。

 

一、硬编码错误消息

直接在验证约束注解上指定错误消息,如下所示:

Java代码  收藏代码
  1. @NotNull(message = "用户名不能为空")  
  2. @Length(min=5, max=20, message="用户名长度必须在5-20之间")  
  3. @Pattern(regexp = "^[a-zA-Z_]\\w{4,19}$", message = "用户名必须以字母下划线开头,可由字母数字下划线组成")  
  4. private String username;   

如上所示,错误消息使用硬编码指定,这种方式是不推荐使用的,因为在如下场景是不适用的:

1、在国际化场景下,需要对不同的国家显示不同的错误消息;

2、需要更换错误消息时是比较麻烦的,需要找到相应的类进行更换,并重新编译发布。

 

二、从资源消息文件中根据消息键读取错误消息

 

2.1、默认的错误消息文件及默认错误消息键值

默认的错误消息文件是/org/hibernate/validator/ValidationMessages.properties,如下图所示:



 默认的错误消息键值如下图所示:



 消息键默认为:验证约束注解的全限定类名.message

 

在我们之前的测试文件中,错误消息键值是使用默认的,如何自定义错误消息文件和错误消息键值呢?

 

2.2、自定义的错误消息文件和错误消息键值

自定义的错误消息文件里的错误消息键值将覆盖默认的错误消息文件中的错误消息键值。我们自定义的错误消息文件是具有国际化功能的。

 

(1、定义错误消息文件

在类装载路径的根下创建ValidationMessages.properties文件,如在src目录下创建会自动复制到类装载路径的根下,并添加如下消息键值(需要native2ascii,可以在eclipse里装Properties Editor,自动保存为ASCII码):

 

Java代码  收藏代码
  1. javax.validation.constraints.Pattern.message=用户名必须以字母或下划线开头,后边可以跟字母数字下划线,长度在5-20之间  

需要在你的spring配置文件WEB-INF/chapter7-servlet.xml修改之前的validator Bean:

 

Java代码  收藏代码
  1. <bean id="validator"   
  2. class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">  
  3.         <property name="providerClass"   
  4. value="org.hibernate.validator.HibernateValidator"/>  
  5. </bean>   

此时错误消息键值的查找会先到classpath下ValidationMessages.properties中找,找不到再到默认的错误消息文件中找。

 

输入测试地址:http://localhost:9080/springmvc-chapter7/validate/pattern?value=zhan,将看到我们自定义的错误消息显示出来了。

 

(2、使用Spring的MessageSource Bean进行消息键值的查找

如果我们的环境是与spring集成,还是应该使用Spring提供的消息支持,具体配置如下:

 

spring配置文件WEB-INF/chapter7-servlet.xml定义MessageSource Bean:

Java代码  收藏代码
  1. <bean id="messageSource"   
  2. class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  
  3.         <property name="basename" value="classpath:messages"/>  
  4.         <property name="fileEncodings" value="utf-8"/>  
  5.         <property name="cacheSeconds" value="120"/>  
  6. </bean>   

之前我们已经配置过了,在此就不详述了。

 

在spring配置文件WEB-INF/chapter7-servlet.xml定义的validator Bean,添加如下属性:

Java代码  收藏代码
  1. <property name="validationMessageSource" ref="messageSource"/>  

 验证失败的错误消息键值的查找将使用messageSource Bean进行。

 

在消息文件src/messages.properties中添加如下错误消息:

Java代码  收藏代码
  1. javax.validation.constraints.Pattern.message=用户名必须以字母或下划线开头,后边可以跟字母数字下划线,长度在5-20之间  

输入测试地址:http://localhost:9080/springmvc-chapter7/validate/pattern?value=zhan,将看到我们自定义的错误消息显示出来了。

 

当我们配置了messageSource Bean时,默认将为验证的对象自动生成如下错误消息键:

验证错误注解简单类名.验证对象名.字段名

验证错误注解简单类名.字段名

验证错误注解简单类名.字段类型全限定类名

验证错误注解简单类名

 

使用的优先级是:从高到低,即最前边的具有最高的优先级,而且以上所有默认的错误消息键优先级高于自定义的错误消息键。

 

如测试用例cn.javass.chapter7.web.controller.validate.ValidatorAnnotationTestController中的public String pattern(@Valid @ModelAttribute("model") PatternModel model, Errors errors)将自动产生如下错误消息键:

Pattern.model.value=验证错误注解简单类名.验证对象名.字段名

Pattern.value=验证错误注解简单类名.字段名

Pattern.java.lang.String=验证错误注解简单类名.字段类型全限定类名

Pattern=验证错误注解简单类名

 

(3、自定义错误消息键值

之前我们已经学习了硬编码错误消息,及默认的错误消息,在大部分场景下,以上两种方式无法满足我们的需求,因此我们需要自定义错误消息键值。

 

在验证约束注解上指定错误消息键:

Java代码  收藏代码
  1. package cn.javass.chapter7.web.controller.validate.model;  
  2. public class PatternModel {   
  3.     @Pattern(regexp = "^[a-zA-Z_][\\w]{4,19}$", message="{user.name.error}")  
  4.     private String value;  
  5. }   

我们可以通过验证约束注解的message属性指定错误消息键,格式如“{消息键}”。

 

在消息文件src/messages.properties中添加如下错误消息:

Java代码  收藏代码
  1. user.name.error=用户名格式不合法  

输入测试地址:http://localhost:9080/springmvc-chapter7/validate/pattern?value=zhan,将看到我们自定义的错误消息显示出来了。

 

接下来我们看下如下场景

Java代码  收藏代码
  1. @Length(min=5, max=20, message="{user.name.length.error}")  
Java代码  收藏代码
  1. user.name.error=用户名长度必须在5-20之间  

错误消息中的5-20应该是从@Length验证约束注解中获取的,而不是在错误消息中硬编码,因此我们需要占位符的支持:

●如@Length(min=5, max=20, message="{user.name.length.error}"),错误消息可以这样写:用户名长度必须在{min}-{max}之间

 

错误消息占位符规则:

{验证注解属性名},如@Length有min和max属性,则在错误消息文件中可以通过{min}和{max}来获取;如@Max有value属性,则在错误消息文件中可以通过{value}来获取。

Java代码  收藏代码
  1. user.name.length.error=用户名长度必须在{min}-{max}之间  

输入测试地址:http://localhost:9080/springmvc-chapter7/validate/length?value=1,将看到我们自定义的错误消息显示出来了。

7.4.2.4、功能处理方法上多个验证参数的处理

当我们在一个功能处理方法上需要验证多个模型对象时,需要通过如下形式来获取验证结果:

Java代码  收藏代码
  1. @RequestMapping("/validate/multi")  
  2. public String multi(  
  3.             @Valid @ModelAttribute("a") A a, BindingResult aErrors,  
  4.             @Valid @ModelAttribute("b") B b, BindingResult bErrors) {  
  5.           
  6.         if(aErrors.hasErrors()) { //如果a模型对象验证失败  
  7.             return "validate/error";  
  8.         }  
  9.         if(bErrors.hasErrors()) { //如果a模型对象验证失败  
  10.             return "validate/error";  
  11.         }  
  12.         return "redirect:/success";  
  13. }   

每一个模型对象后边都需要跟一个Errors或BindingResult对象来保存验证结果,其方法体内部可以使用这两个验证结果对象来选择出错时跳转的页面。详见cn.javass.chapter7.web.controller.validate.MultiModelController。

 

在错误页面,需要针对不同的模型来显示错误消息:

Java代码  收藏代码
  1. <form:form commandName="a">  
  2.     <form:errors path="*" cssStyle="color:red"></form:errors><br/>  
  3. </form:form>  
  4. <form:form commandName="b">  
  5.     <form:errors path="*" cssStyle="color:red"></form:errors><br/>  
  6. </form:form>   

 

 

 

 

30 
3 
分享到:  
评论
94 楼 pudong 2015-01-12  
请教一下,怎么解决XSS的问题,有没有完整的方案或者建议啊!
93 楼 紫_色 2014-12-27  
明明是在github上啊
92 楼 jinnianshilongnian 2014-03-05  
hquxiezk 写道
有个问题请教一下,遇到这么一个问题,数据库有个字段 是float型
配置验证条件为@Digits(integer=2,fraction=2),正常输入12.333这样是可以验证的,
但是如果输入空白 就会Failed to convert property value of type java.lang.String to required type float for property fbReservation; nested exception is java.lang.NumberFormatException: empty String
或者输入非数字,如dd就会 Failed to convert property value of type java.lang.String to required type float for property fbReservation; nested exception is java.lang.NumberFormatException: For input string: "ddd"
这样对用户很不友好,不知道hibernate是否提供注解来,@NotBlank 不能加,一加就会报错。
是不是只能自己自定义验证注解。

你再加个@NotNull 或者 @NotEmpty 试试
91 楼 hquxiezk 2014-03-05  
有个问题请教一下,遇到这么一个问题,数据库有个字段 是float型
配置验证条件为@Digits(integer=2,fraction=2),正常输入12.333这样是可以验证的,
但是如果输入空白 就会Failed to convert property value of type java.lang.String to required type float for property fbReservation; nested exception is java.lang.NumberFormatException: empty String
或者输入非数字,如dd就会 Failed to convert property value of type java.lang.String to required type float for property fbReservation; nested exception is java.lang.NumberFormatException: For input string: "ddd"
这样对用户很不友好,不知道hibernate是否提供注解来,@NotBlank 不能加,一加就会报错。
是不是只能自己自定义验证注解。
90 楼 hellostory 2013-12-16  
你好!请问Ajax提交表单后,验证消息如何国际化,能否给个DEMO,比较现在Ajax使用越来越频繁!
89 楼 yulinling1230 2013-11-25  
涛ge好厉害,这要折腾多长时间才能到涛ge这程度?哎,发了两遍,有敏感词汇
88 楼 ft6216035 2013-11-04  
jinnianshilongnian 写道
ft6216035 写道

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">  
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<property name="validationMessageSource" ref="messageSource"/>  
</bean>   


<mvc:annotation-driven validator="validator"/>



你好~!我是个初学者,我还有个问题。以上是配置spring-mvc。
我想自己写个方法把验证信息取出来!想跟现在取message一样。
现在我自己写了个反射把我的javabean上的验证标签全部取出,
// ReloadableResourceBundleMessageSource rrbms = new ReloadableResourceBundleMessageSource();//由于这是工具类,用注视去不到messageSource
// rrbms.setBasename("classpath:/message/ValidationMessages");;
// rrbms.setUseCodeAsDefaultMessage(false);
// rrbms.setDefaultEncoding("UTF-8");
// LocalValidatorFactoryBean lvfb = new LocalValidatorFactoryBean();
// lvfb.setProviderClass(HibernateValidator.class);
// lvfb.setValidationMessageSource(rrbms);
// lvfb.afterPropertiesSet();
ResourceBundleMessageInterpolator rbmi = new ResourceBundleMessageInterpolator(null, true);
ConstraintDescriptorImpl constraintValidatorContext
= new ConstraintDescriptorImpl(annotation, new ConstraintHelper(), null, ElementType.FIELD,null);
LocaleContextMessageInterpolator lcmi = new LocaleContextMessageInterpolator(rbmi);
// resultMessage = rbmi.interpolate(
// message,
// new MessageInterpolatorContext(constraintValidatorContext, null),
// LocaleContextHolder.getLocale());
resultMessage = lcmi.interpolate(message, new MessageInterpolatorContext(constraintValidatorContext, null));
但是这样取message的话,会去hibernate-validator的默认地址。
而现在 我又不太想用getMessage方法
请问还有什么好方法吗?



你好 我想明白了 谢谢你提供的资料
87 楼 ft6216035 2013-11-04  
ft6216035 写道

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">  
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<property name="validationMessageSource" ref="messageSource"/>  
</bean>   


<mvc:annotation-driven validator="validator"/>



你好~!我是个初学者,我还有个问题。以上是配置spring-mvc。
我想自己写个方法把验证信息取出来!想跟现在取message一样。
现在我自己写了个反射把我的javabean上的验证标签全部取出,
// ReloadableResourceBundleMessageSource rrbms = new ReloadableResourceBundleMessageSource();//由于这是工具类,用注视去不到messageSource
// rrbms.setBasename("classpath:/message/ValidationMessages");;
// rrbms.setUseCodeAsDefaultMessage(false);
// rrbms.setDefaultEncoding("UTF-8");
// LocalValidatorFactoryBean lvfb = new LocalValidatorFactoryBean();
// lvfb.setProviderClass(HibernateValidator.class);
// lvfb.setValidationMessageSource(rrbms);
// lvfb.afterPropertiesSet();
ResourceBundleMessageInterpolator rbmi = new ResourceBundleMessageInterpolator(null, true);
ConstraintDescriptorImpl constraintValidatorContext
= new ConstraintDescriptorImpl(annotation, new ConstraintHelper(), null, ElementType.FIELD,null);
LocaleContextMessageInterpolator lcmi = new LocaleContextMessageInterpolator(rbmi);
// resultMessage = rbmi.interpolate(
// message,
// new MessageInterpolatorContext(constraintValidatorContext, null),
// LocaleContextHolder.getLocale());
resultMessage = lcmi.interpolate(message, new MessageInterpolatorContext(constraintValidatorContext, null));
但是这样取message的话,会去hibernate-validator的默认地址。
而现在 我又不太想用getMessage方法
请问还有什么好方法吗?
86 楼 ft6216035 2013-11-04  
jinnianshilongnian 写道
ft6216035 写道
你好 我有个问题 
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">  
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<property name="validationMessageSource" ref="messageSource"/>  
</bean>   


<mvc:annotation-driven validator="validator"/>

报出的错误:
最小不能小于value 
个数必须在min和max之间 
长度需要在min和max之间 


这是怎么回事呢?


终于看明白你的问题了,

看看这篇吧
http://jinnianshilongnian./blog/1879166


哦 明白了 太感谢了
85 楼 jinnianshilongnian 2013-11-04  
ft6216035 写道
你好 我有个问题 
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">  
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<property name="validationMessageSource" ref="messageSource"/>  
</bean>   


<mvc:annotation-driven validator="validator"/>

报出的错误:
最小不能小于value 
个数必须在min和max之间 
长度需要在min和max之间 


这是怎么回事呢?


终于看明白你的问题了,

看看这篇吧
http://jinnianshilongnian./blog/1879166
84 楼 ft6216035 2013-11-04  
jinnianshilongnian 写道
ft6216035 写道
jinnianshilongnian 写道
ft6216035 写道
你好 我有个问题 
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">  
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<property name="validationMessageSource" ref="messageSource"/>  
</bean>   


<mvc:annotation-driven validator="validator"/>

报出的错误:
最小不能小于value 
个数必须在min和max之间 
长度需要在min和max之间 


这是怎么回事呢?


把相关配置贴一下


<!-- 只搜索@Controller 标注的类 不搜索其他标注的类 -->
<context:component-scan base-package="cn.com.dl.huachang.dodos"
use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 国际化配置-->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:/message/messages</value>
<value>classpath:/message/ValidationMessages</value>
</list> 
</property>
<property name="useCodeAsDefaultMessage" value="true"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
<!-- Saves a locale change using a session-->
<bean id="localeResolver"  class="org.springframework.web.servlet.i18n.SessionLocaleResolver"> 
<!-- 默认语言为中文 -->
<property name="defaultLocale" value="zh"/>
</bean>
<!-- 国际化操作 拦截器 必需配置,可以和其它国际化方式通用, 用于监听浏览器端locale的变化 -->
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> 
<property name="paramName" value="ln" />
</bean>

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
  <property name="interceptors">
   <list>
    <ref bean="localeChangeInterceptor" />
  </list>
  </property>
</bean>

再加上上边已经贴过的代码也就没什么了 在一个就是<!--异常处理--> 但和这个没有关系

你把所有相关的 配置文件、类、错误信息  都发我站内信吧


我dug看了一眼 替换message内容参数的时候,因为ResourceBundle bundle它引起的问题
83 楼 jinnianshilongnian 2013-11-04  
ft6216035 写道
jinnianshilongnian 写道
ft6216035 写道
你好 我有个问题 
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">  
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<property name="validationMessageSource" ref="messageSource"/>  
</bean>   


<mvc:annotation-driven validator="validator"/>

报出的错误:
最小不能小于value 
个数必须在min和max之间 
长度需要在min和max之间 


这是怎么回事呢?


把相关配置贴一下


<!-- 只搜索@Controller 标注的类 不搜索其他标注的类 -->
<context:component-scan base-package="cn.com.dl.huachang.dodos"
use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 国际化配置-->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:/message/messages</value>
<value>classpath:/message/ValidationMessages</value>
</list> 
</property>
<property name="useCodeAsDefaultMessage" value="true"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
<!-- Saves a locale change using a session-->
<bean id="localeResolver"  class="org.springframework.web.servlet.i18n.SessionLocaleResolver"> 
<!-- 默认语言为中文 -->
<property name="defaultLocale" value="zh"/>
</bean>
<!-- 国际化操作 拦截器 必需配置,可以和其它国际化方式通用, 用于监听浏览器端locale的变化 -->
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> 
<property name="paramName" value="ln" />
</bean>

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
  <property name="interceptors">
   <list>
    <ref bean="localeChangeInterceptor" />
  </list>
  </property>
</bean>

再加上上边已经贴过的代码也就没什么了 在一个就是<!--异常处理--> 但和这个没有关系

你把所有相关的 配置文件、类、错误信息  都发我站内信吧
82 楼 ft6216035 2013-11-04  
jinnianshilongnian 写道
ft6216035 写道
你好 我有个问题 
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">  
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<property name="validationMessageSource" ref="messageSource"/>  
</bean>   


<mvc:annotation-driven validator="validator"/>

报出的错误:
最小不能小于value 
个数必须在min和max之间 
长度需要在min和max之间 


这是怎么回事呢?


把相关配置贴一下


<!-- 只搜索@Controller 标注的类 不搜索其他标注的类 -->
<context:component-scan base-package="cn.com.dl.huachang.dodos"
use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 国际化配置-->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:/message/messages</value>
<value>classpath:/message/ValidationMessages</value>
</list> 
</property>
<property name="useCodeAsDefaultMessage" value="true"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
<!-- Saves a locale change using a session-->
<bean id="localeResolver"  class="org.springframework.web.servlet.i18n.SessionLocaleResolver"> 
<!-- 默认语言为中文 -->
<property name="defaultLocale" value="zh"/>
</bean>
<!-- 国际化操作 拦截器 必需配置,可以和其它国际化方式通用, 用于监听浏览器端locale的变化 -->
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> 
<property name="paramName" value="ln" />
</bean>

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
  <property name="interceptors">
   <list>
    <ref bean="localeChangeInterceptor" />
  </list>
  </property>
</bean>

再加上上边已经贴过的代码也就没什么了 在一个就是<!--异常处理--> 但和这个没有关系
81 楼 jinnianshilongnian 2013-11-02  
ft6216035 写道
你好 我有个问题 
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">  
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<property name="validationMessageSource" ref="messageSource"/>  
</bean>   


<mvc:annotation-driven validator="validator"/>

报出的错误:
最小不能小于value 
个数必须在min和max之间 
长度需要在min和max之间 


这是怎么回事呢?


把相关配置贴一下
80 楼 ft6216035 2013-11-01  
你好 我有个问题 
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">  
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<property name="validationMessageSource" ref="messageSource"/>  
</bean>   


<mvc:annotation-driven validator="validator"/>

报出的错误:
最小不能小于value 
个数必须在min和max之间 
长度需要在min和max之间 


这是怎么回事呢?

79 楼 www5177 2013-10-23  
jinnianshilongnian 写道
www5177 写道
你好,我遇到一个问题
Java代码  收藏代码
  1. @NotNull(message = "用户名不能为空")    
  2. @Length(min=5, max=20, message="用户名长度必须在5-20之间")    
  3. @Pattern(regexp = "^[a-zA-Z_]\\w{4,19}$", message = "用户名必须以字母下划线开头,可由字母数字下划线组成")    
  4. private String username;  


如果仅仅是 用户输入为空,前台只提示 用户名不能为空,不提示 关于@Length与@Pattern改如何做到


这个目前我知道的是 做不到;



感谢你的回复。貌似默认是哪个错了提示哪个。还要再确定下。
78 楼 jinnianshilongnian 2013-10-10  
www5177 写道
你好,我遇到一个问题
Java代码  收藏代码
  1. @NotNull(message = "用户名不能为空")    
  2. @Length(min=5, max=20, message="用户名长度必须在5-20之间")    
  3. @Pattern(regexp = "^[a-zA-Z_]\\w{4,19}$", message = "用户名必须以字母下划线开头,可由字母数字下划线组成")    
  4. private String username;  


如果仅仅是 用户输入为空,前台只提示 用户名不能为空,不提示 关于@Length与@Pattern改如何做到


这个目前我知道的是 做不到;
77 楼 www5177 2013-10-09  
你好,我遇到一个问题
Java代码  收藏代码
  1. @NotNull(message = "用户名不能为空")    
  2. @Length(min=5, max=20, message="用户名长度必须在5-20之间")    
  3. @Pattern(regexp = "^[a-zA-Z_]\\w{4,19}$", message = "用户名必须以字母下划线开头,可由字母数字下划线组成")    
  4. private String username;  


如果仅仅是 用户输入为空,前台只提示 用户名不能为空,不提示 关于@Length与@Pattern改如何做到

76 楼 jinnianshilongnian 2013-08-30  
wubin_2003 写道
jinnianshilongnian 写道
wubin_2003 写道
jinnianshilongnian 写道
wubin_2003 写道
涛神,你的es项目我从github上clone下来了,但是pom.xml提示验证码的几个jar包没有,maven中心仓库也没有,项目运行不起来,需要您的帮助

那个是在google code上 你多试几次试试


明明是在github上啊,地址是https://github.com/zhangkaitao/es ,验证码那个jar包如果maven仓库没有的话,我去哪里找?


github上只是项目托管; 依赖还是从其他仓库下的;  验证码那个目前我知道的只有google code 你看看google code

你直接访问下 
https://maven-db-plugin./svn/maven/repo

试试能访问吗? 如果能 那估计是下载比较慢

确定是jcaptcha的 还是其他的?



myeclipse控制台:
13-8-30 上午09时45分21秒: Missing artifact com.octo.captcha:jcaptcha:jar:2.0-alpha-1:compile
13-8-30 上午09时45分21秒: Missing artifact com.octo.captcha:jcaptcha-integration-simple-servlet:jar:2.0-alpha-1:compile
你给的网址,能fanqiang访问的,可以访问,我是去下载:/maven/repo/com/googlecode/maven-db-plugin/1.4-SNAPSHOT/maven-db-plugin-1.4-SNAPSHOT.jar,是这个jar包吗?



你试试
http:///mvn/sourceforge-releases/com.octo.captcha/jcaptcha/2.0-alpha-1

这篇文章里的
75 楼 wubin_2003 2013-08-30  
jinnianshilongnian 写道
wubin_2003 写道
jinnianshilongnian 写道
wubin_2003 写道
涛神,你的es项目我从github上clone下来了,但是pom.xml提示验证码的几个jar包没有,maven中心仓库也没有,项目运行不起来,需要您的帮助

那个是在google code上 你多试几次试试


明明是在github上啊,地址是https://github.com/zhangkaitao/es ,验证码那个jar包如果maven仓库没有的话,我去哪里找?


github上只是项目托管; 依赖还是从其他仓库下的;  验证码那个目前我知道的只有google code 你看看google code

你直接访问下 
https://maven-db-plugin./svn/maven/repo

试试能访问吗? 如果能 那估计是下载比较慢

确定是jcaptcha的 还是其他的?



myeclipse控制台:
13-8-30 上午09时45分21秒: Missing artifact com.octo.captcha:jcaptcha:jar:2.0-alpha-1:compile
13-8-30 上午09时45分21秒: Missing artifact com.octo.captcha:jcaptcha-integration-simple-servlet:jar:2.0-alpha-1:compile
你给的网址,能fanqiang访问的,可以访问,我是去下载:/maven/repo/com/googlecode/maven-db-plugin/1.4-SNAPSHOT/maven-db-plugin-1.4-SNAPSHOT.jar,是这个jar包吗?

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多