7.4、數(shù)據(jù)驗證
7.4.1、編程式數(shù)據(jù)驗證
Spring 2.x提供了編程式驗證支持,詳見【4.16.2 數(shù)據(jù)驗證】章節(jié),在此我們重寫【4.16.2.4.1、編程式驗證器】一節(jié)示例。
(1、驗證器實現(xiàn)
復(fù)制cn.javass.chapter4.web.controller.support.validator.UserModelValidator
到cn.javass.chapter7.web.controller.support.validator.UserModelValidator。
(2、控制器實現(xiàn)
- @Controller
- public class RegisterSimpleFormController {
- private UserModelValidator validator = new UserModelValidator();
- @ModelAttribute("user") //① 暴露表單引用對象為模型數(shù)據(jù)
- public UserModel getUser() {
- return new UserModel();
- }
- @RequestMapping(value = "/validator", method = RequestMethod.GET)
- public String showRegisterForm() { //② 表單展示
- return "validate/registerAndValidator";
- }
- @RequestMapping(value = "/validator", method = RequestMethod.POST)
- public String submitForm(
- @ModelAttribute("user") UserModel user,
- Errors errors) { //③ 表單提交
- validator.validate(user, errors); //1 調(diào)用UserModelValidator的validate方法進行驗證
- if(errors.hasErrors()) { //2如果有錯誤再回到表單展示頁面
- return showRegisterForm();
- }
- return "redirect:/success";
- }
- }
在submitForm方法中,我們首先調(diào)用之前寫的UserModelValidator的validate方法進行驗證,當(dāng)然此處可以直接驗證并通過Errors接口來保留錯誤;此處還通過 Errors接口的hasErrors方法來決定當(dāng)驗證失敗時顯示的錯誤頁面。
 
(3、spring配置文件chapter7-servlet.xml
- <bean class="cn.javass.chapter7.web.controller.RegisterSimpleFormController"/>
(4、錯誤碼配置(messages.properties),需要執(zhí)行NativeToAscii
直接將【springmvc-chapter4】項目中src下的messages.properties復(fù)制到src目錄下。
在spring配置文件chapter7-servlet.xml中添加messageSource:
- <bean id="messageSource"
- class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
- <property name="basename" value="classpath:messages"/>
- <property name="fileEncodings" value="utf-8"/>
- <property name="cacheSeconds" value="120"/>
- </bean>
(5、視圖頁面(/WEB-INF/jsp/registerAndValidator.jsp)
直接將【springmvc-chapter4】項目中的/WEB-INF/jsp/registerAndValidator.jsp復(fù)制到當(dāng)前項目下的/WEB-INF/jsp/validate/registerAndValidator.jsp。
(6、啟動服務(wù)器測試:
在瀏覽器地址欄輸入http://localhost:9080/springmvc-chapter7/validator進行測試,測試步驟和【4.16.2.4.1、編程式驗證器】一樣。
其他編程式驗證的使用,請參考【4.16.2 數(shù)據(jù)驗證】章節(jié)。
7.4.2、聲明式數(shù)據(jù)驗證
Spring3開始支持JSR-303驗證框架,JSR-303支持XML風(fēng)格的和注解風(fēng)格的驗證,接下來我們首先看一下如何和Spring集成。
7.4.2.1、集成
(1、添加jar包:
此處使用Hibernate-validator實現(xiàn)(版本:hibernate-validator-4.3.0.Final-dist.zip),將如下jar包添加到classpath(WEB-INF/lib下即可):
dist/hibernate-validator-4.3.0.Final.jar Hibernate 參考實現(xiàn)
(2、在Spring配置總添加對JSR-303驗證框架的支持
- <!-- 以下 validator ConversionService 在使用 mvc:annotation-driven 會 自動注冊-->
- <bean id="validator"
- class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
- <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
- <!-- 如果不加默認(rèn)到 使用classpath下的 ValidationMessages.properties -->
- <property name="validationMessageSource" ref="messageSource"/>
- </bean>
此處使用Hibernate validator實現(xiàn):
validationMessageSource屬性:指定國際化錯誤消息從哪里取,此處使用之前定義的messageSource來獲取國際化消息;如果此處不指定該屬性,則默認(rèn)到classpath下的ValidationMessages.properties取國際化錯誤消息。
通過ConfigurableWebBindingInitializer注冊validator:
- <bean id="webBindingInitializer"
- class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
- <property name="conversionService" ref="conversionService"/>
- <property name="validator" ref="validator"/>
- </bean>
其他配置和之前學(xué)習(xí)7.2.2.4一節(jié)一樣。
如上集成過程看起來比較麻煩,后邊我們會介紹<mvc:annotation-driven>和@EnableWebMvc,ConversionService會自動注冊,后續(xù)章節(jié)再詳細(xì)介紹。
(3、使用JSR-303驗證框架注解為模型對象指定驗證信息
- package cn.javass.chapter7.model;
- import javax.validation.constraints.NotNull;
- public class UserModel {
- @NotNull(message="{username.not.empty}")
- private String username;
- }
通過@NotNull指定此username字段不允許為空,當(dāng)驗證失敗時將從之前指定的messageSource中獲取“username.not.empty”對于的錯誤信息,此處只有通過“{錯誤消息鍵值}”格式指定的才能從messageSource獲取。
(4、控制器
- package cn.javass.chapter7.web.controller.validate;
- //省略import
- @Controller
- public class HelloWorldController {
- @RequestMapping("/validate/hello")
- public String validate(@Valid @ModelAttribute("user") UserModel user, Errors errors) {
- if(errors.hasErrors()) {
- return "validate/error";
- }
- return "redirect:/success";
- }
- }
通過在命令對象上注解@Valid來告訴Spring MVC此命令對象在綁定完畢后需要進行JSR-303驗證,如果驗證失敗會將錯誤信息添加到errors錯誤對象中。
(5、驗證失敗后需要展示的頁面(/WEB-INF/jsp/validate/error.jsp)
- <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
- <%@taglib prefix="form" uri="http://www./tags/form" %>
- <form:form commandName="user">
- <form:errors path="*" cssStyle="color:red"></form:errors><br/>
- </form:form>
(6、測試
在瀏覽器地址欄中輸入http://localhost:9080/springmvc-chapter7/validate/hello,即沒有username數(shù)據(jù),請求后將直接到驗證失敗界面并顯示錯誤消息“用戶名不能為空”,如果請求時帶上“?username=zhang”將重定向到成功頁面。
到此集成就完成,接下來我們詳細(xì)學(xué)習(xí)下有哪些驗證約束注解吧。
7.4.2.2、內(nèi)置的驗證約束注解
內(nèi)置的驗證約束注解如下表所示(摘自hibernate validator reference):
| 驗證注解 | 驗證的數(shù)據(jù)類型 | 說明 | 
| @AssertFalse | Boolean,boolean | 驗證注解的元素值是false | 
| @AssertTrue | Boolean,boolean | 驗證注解的元素值是true | 
| @NotNull | 任意類型 | 驗證注解的元素值不是null | 
| @Null | 任意類型 | 驗證注解的元素值是null | 
| @Min(value=值) | BigDecimal,BigInteger, byte, short, int, long,等任何Number或CharSequence(存儲的是數(shù)字)子類型 | 驗證注解的元素值大于等于@Min指定的value值 | 
| @Max(value=值) | 和@Min要求一樣 | 驗證注解的元素值小于等于@Max指定的value值 | 
| @DecimalMin(value=值) | 和@Min要求一樣 | 驗證注解的元素值大于等于@ DecimalMin指定的value值 | 
| @DecimalMax(value=值) | 和@Min要求一樣 | 驗證注解的元素值小于等于@ DecimalMax指定的value值 | 
| @Digits(integer=整數(shù)位數(shù), fraction=小數(shù)位數(shù)) | 和@Min要求一樣 | 驗證注解的元素值的整數(shù)位數(shù)和小數(shù)位數(shù)上限 | 
| @Size(min=下限, max=上限) | 字符串、Collection、Map、數(shù)組等 | 驗證注解的元素值的在min和max(包含)指定區(qū)間之內(nèi),如字符長度、集合大小 | 
| @Past | java.util.Date, java.util.Calendar; Joda Time類庫的日期類型 | 驗證注解的元素值(日期類型)比當(dāng)前時間早 | 
| @Future | 與@Past要求一樣 | 驗證注解的元素值(日期類型)比當(dāng)前時間晚 | 
| @NotBlank | CharSequence子類型 | 驗證注解的元素值不為空(不為null、去除首位空格后長度為0),不同于@NotEmpty,@NotBlank只應(yīng)用于字符串且在比較時會去除字符串的首位空格 | 
| @Length(min=下限, max=上限) | CharSequence子類型 | 驗證注解的元素值長度在min和max區(qū)間內(nèi) | 
| @NotEmpty | CharSequence子類型、Collection、Map、數(shù)組 | 驗證注解的元素值不為null且不為空(字符串長度不為0、集合大小不為0) | 
| @Range(min=最小值, max=最大值) | BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子類型和包裝類型 | 驗證注解的元素值在最小值和最大值之間 | 
| @Email(regexp=正則表達式, flag=標(biāo)志的模式) | CharSequence子類型(如String) | 驗證注解的元素值是Email,也可以通過regexp和flag指定自定義的email格式 | 
| @Pattern(regexp=正則表達式, flag=標(biāo)志的模式) | String,任何CharSequence的子類型 | 驗證注解的元素值與指定的正則表達式匹配 | 
| @Valid | 任何非原子類型 | 指定遞歸驗證關(guān)聯(lián)的對象; 如用戶對象中有個地址對象屬性,如果想在驗證用戶對象時一起驗證地址對象的話,在地址對象上加@Valid注解即可級聯(lián)驗證 | 
此處只列出Hibernate Validator提供的大部分驗證約束注解,請參考hibernate validator官方文檔了解其他驗證約束注解和進行自定義的驗證約束注解定義。
具體演示實例請參考cn.javass.chapter7.web.controller.validate.ValidatorAnnotationTestController。
7.4.2.3、錯誤消息
當(dāng)驗證出錯時,我們需要給用戶展示錯誤消息告訴用戶出錯的原因,因此我們要為驗證約束注解指定錯誤消息。錯誤消息是通過在驗證約束注解的message屬性指定。驗證約束注解指定錯誤消息有如下兩種方式:
1、硬編碼錯誤消息;
2、從資源消息文件中根據(jù)消息鍵讀取錯誤消息。
一、硬編碼錯誤消息
直接在驗證約束注解上指定錯誤消息,如下所示:
- @NotNull(message = "用戶名不能為空")
- @Length(min=5, max=20, message="用戶名長度必須在5-20之間")
- @Pattern(regexp = "^[a-zA-Z_]\\w{4,19}$", message = "用戶名必須以字母下劃線開頭,可由字母數(shù)字下劃線組成")
- private String username;
如上所示,錯誤消息使用硬編碼指定,這種方式是不推薦使用的,因為在如下場景是不適用的:
1、在國際化場景下,需要對不同的國家顯示不同的錯誤消息;
2、需要更換錯誤消息時是比較麻煩的,需要找到相應(yīng)的類進行更換,并重新編譯發(fā)布。
二、從資源消息文件中根據(jù)消息鍵讀取錯誤消息
2.1、默認(rèn)的錯誤消息文件及默認(rèn)錯誤消息鍵值
默認(rèn)的錯誤消息文件是/org/hibernate/validator/ValidationMessages.properties,如下圖所示:

 默認(rèn)的錯誤消息鍵值如下圖所示:

 消息鍵默認(rèn)為:驗證約束注解的全限定類名.message
在我們之前的測試文件中,錯誤消息鍵值是使用默認(rèn)的,如何自定義錯誤消息文件和錯誤消息鍵值呢?
2.2、自定義的錯誤消息文件和錯誤消息鍵值
自定義的錯誤消息文件里的錯誤消息鍵值將覆蓋默認(rèn)的錯誤消息文件中的錯誤消息鍵值。我們自定義的錯誤消息文件是具有國際化功能的。
(1、定義錯誤消息文件
在類裝載路徑的根下創(chuàng)建ValidationMessages.properties文件,如在src目錄下創(chuàng)建會自動復(fù)制到類裝載路徑的根下,并添加如下消息鍵值(需要native2ascii,可以在eclipse里裝Properties Editor,自動保存為ASCII碼):
- javax.validation.constraints.Pattern.message=用戶名必須以字母或下劃線開頭,后邊可以跟字母數(shù)字下劃線,長度在5-20之間
需要在你的spring配置文件WEB-INF/chapter7-servlet.xml修改之前的validator Bean:
- <bean id="validator"
- class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
- <property name="providerClass"
- value="org.hibernate.validator.HibernateValidator"/>
- </bean>
此時錯誤消息鍵值的查找會先到classpath下ValidationMessages.properties中找,找不到再到默認(rèn)的錯誤消息文件中找。
輸入測試地址:http://localhost:9080/springmvc-chapter7/validate/pattern?value=zhan,將看到我們自定義的錯誤消息顯示出來了。
(2、使用Spring的MessageSource Bean進行消息鍵值的查找
如果我們的環(huán)境是與spring集成,還是應(yīng)該使用Spring提供的消息支持,具體配置如下:
在spring配置文件WEB-INF/chapter7-servlet.xml定義MessageSource Bean:
- <bean id="messageSource"
- class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
- <property name="basename" value="classpath:messages"/>
- <property name="fileEncodings" value="utf-8"/>
- <property name="cacheSeconds" value="120"/>
- </bean>
之前我們已經(jīng)配置過了,在此就不詳述了。
在spring配置文件WEB-INF/chapter7-servlet.xml定義的validator Bean,添加如下屬性:
- <property name="validationMessageSource" ref="messageSource"/>
驗證失敗的錯誤消息鍵值的查找將使用messageSource Bean進行。
在消息文件src/messages.properties中添加如下錯誤消息:
- javax.validation.constraints.Pattern.message=用戶名必須以字母或下劃線開頭,后邊可以跟字母數(shù)字下劃線,長度在5-20之間
輸入測試地址:http://localhost:9080/springmvc-chapter7/validate/pattern?value=zhan,將看到我們自定義的錯誤消息顯示出來了。
當(dāng)我們配置了messageSource Bean時,默認(rèn)將為驗證的對象自動生成如下錯誤消息鍵:
驗證錯誤注解簡單類名.驗證對象名.字段名
驗證錯誤注解簡單類名.字段名
驗證錯誤注解簡單類名.字段類型全限定類名
驗證錯誤注解簡單類名
使用的優(yōu)先級是:從高到低,即最前邊的具有最高的優(yōu)先級,而且以上所有默認(rèn)的錯誤消息鍵優(yōu)先級高于自定義的錯誤消息鍵。
如測試用例cn.javass.chapter7.web.controller.validate.ValidatorAnnotationTestController中的public String pattern(@Valid @ModelAttribute("model") PatternModel model, Errors errors)將自動產(chǎn)生如下錯誤消息鍵:
Pattern.model.value=驗證錯誤注解簡單類名.驗證對象名.字段名
Pattern.value=驗證錯誤注解簡單類名.字段名
Pattern.java.lang.String=驗證錯誤注解簡單類名.字段類型全限定類名
Pattern=驗證錯誤注解簡單類名
(3、自定義錯誤消息鍵值
之前我們已經(jīng)學(xué)習(xí)了硬編碼錯誤消息,及默認(rèn)的錯誤消息,在大部分場景下,以上兩種方式無法滿足我們的需求,因此我們需要自定義錯誤消息鍵值。
在驗證約束注解上指定錯誤消息鍵:
- package cn.javass.chapter7.web.controller.validate.model;
- public class PatternModel {
- @Pattern(regexp = "^[a-zA-Z_][\\w]{4,19}$", message="{user.name.error}")
- private String value;
- }
我們可以通過驗證約束注解的message屬性指定錯誤消息鍵,格式如“{消息鍵}”。
在消息文件src/messages.properties中添加如下錯誤消息:
- user.name.error=用戶名格式不合法
輸入測試地址:http://localhost:9080/springmvc-chapter7/validate/pattern?value=zhan,將看到我們自定義的錯誤消息顯示出來了。
接下來我們看下如下場景
- @Length(min=5, max=20, message="{user.name.length.error}")
- user.name.error=用戶名長度必須在5-20之間
錯誤消息中的5-20應(yīng)該是從@Length驗證約束注解中獲取的,而不是在錯誤消息中硬編碼,因此我們需要占位符的支持:
●如@Length(min=5, max=20, message="{user.name.length.error}"),錯誤消息可以這樣寫:用戶名長度必須在{min}-{max}之間
錯誤消息占位符規(guī)則:
{驗證注解屬性名},如@Length有min和max屬性,則在錯誤消息文件中可以通過{min}和{max}來獲??;如@Max有value屬性,則在錯誤消息文件中可以通過{value}來獲取。
- user.name.length.error=用戶名長度必須在{min}-{max}之間
輸入測試地址:http://localhost:9080/springmvc-chapter7/validate/length?value=1,將看到我們自定義的錯誤消息顯示出來了。
7.4.2.4、功能處理方法上多個驗證參數(shù)的處理
當(dāng)我們在一個功能處理方法上需要驗證多個模型對象時,需要通過如下形式來獲取驗證結(jié)果:
- @RequestMapping("/validate/multi")
- public String multi(
- @Valid @ModelAttribute("a") A a, BindingResult aErrors,
- @Valid @ModelAttribute("b") B b, BindingResult bErrors) {
- if(aErrors.hasErrors()) { //如果a模型對象驗證失敗
- return "validate/error";
- }
- if(bErrors.hasErrors()) { //如果a模型對象驗證失敗
- return "validate/error";
- }
- return "redirect:/success";
- }
每一個模型對象后邊都需要跟一個Errors或BindingResult對象來保存驗證結(jié)果,其方法體內(nèi)部可以使用這兩個驗證結(jié)果對象來選擇出錯時跳轉(zhuǎn)的頁面。詳見cn.javass.chapter7.web.controller.validate.MultiModelController。
在錯誤頁面,需要針對不同的模型來顯示錯誤消息:
- <form:form commandName="a">
- <form:errors path="*" cssStyle="color:red"></form:errors><br/>
- </form:form>
- <form:form commandName="b">
- <form:errors path="*" cssStyle="color:red"></form:errors><br/>
- </form:form>
頂
踩
- 2012-11-23 07:47
- 瀏覽 61060
- 評論(94)
- 分類:企業(yè)架構(gòu)
- 相關(guān)推薦

 
                         
                                
 
                                


 
                        

評論
配置驗證條件為@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
或者輸入非數(shù)字,如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 試試
配置驗證條件為@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
或者輸入非數(shù)字,如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 不能加,一加就會報錯。
是不是只能自己自定義驗證注解。
<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"/>
你好~!我是個初學(xué)者,我還有個問題。以上是配置spring-mvc。
我想自己寫個方法把驗證信息取出來!想跟現(xiàn)在取message一樣。
現(xiàn)在我自己寫了個反射把我的javabean上的驗證標(biāo)簽全部取出,
// 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的默認(rèn)地址。
而現(xiàn)在 我又不太想用getMessage方法
請問還有什么好方法嗎?
你好 我想明白了 謝謝你提供的資料
<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"/>
你好~!我是個初學(xué)者,我還有個問題。以上是配置spring-mvc。
我想自己寫個方法把驗證信息取出來!想跟現(xiàn)在取message一樣。
現(xiàn)在我自己寫了個反射把我的javabean上的驗證標(biāo)簽全部取出,
// 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的默認(rèn)地址。
而現(xiàn)在 我又不太想用getMessage方法
請問還有什么好方法嗎?
<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
個數(shù)必須在min和max之間
長度需要在min和max之間
這是怎么回事呢?
終于看明白你的問題了,
看看這篇吧
http://jinnianshilongnian./blog/1879166
哦 明白了 太感謝了
<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
個數(shù)必須在min和max之間
長度需要在min和max之間
這是怎么回事呢?
終于看明白你的問題了,
看看這篇吧
http://jinnianshilongnian./blog/1879166
<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
個數(shù)必須在min和max之間
長度需要在min和max之間
這是怎么回事呢?
把相關(guān)配置貼一下
<!-- 只搜索@Controller 標(biāo)注的類 不搜索其他標(biāo)注的類 -->
<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">
<!-- 默認(rèn)語言為中文 -->
<property name="defaultLocale" value="zh"/>
</bean>
<!-- 國際化操作 攔截器 必需配置,可以和其它國際化方式通用, 用于監(jiān)聽瀏覽器端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>
再加上上邊已經(jīng)貼過的代碼也就沒什么了 在一個就是<!--異常處理--> 但和這個沒有關(guān)系
你把所有相關(guān)的 配置文件、類、錯誤信息 都發(fā)我站內(nèi)信吧
我dug看了一眼 替換message內(nèi)容參數(shù)的時候,因為ResourceBundle bundle它引起的問題
<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
個數(shù)必須在min和max之間
長度需要在min和max之間
這是怎么回事呢?
把相關(guān)配置貼一下
<!-- 只搜索@Controller 標(biāo)注的類 不搜索其他標(biāo)注的類 -->
<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">
<!-- 默認(rèn)語言為中文 -->
<property name="defaultLocale" value="zh"/>
</bean>
<!-- 國際化操作 攔截器 必需配置,可以和其它國際化方式通用, 用于監(jiān)聽瀏覽器端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>
再加上上邊已經(jīng)貼過的代碼也就沒什么了 在一個就是<!--異常處理--> 但和這個沒有關(guān)系
你把所有相關(guān)的 配置文件、類、錯誤信息 都發(fā)我站內(nèi)信吧
<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
個數(shù)必須在min和max之間
長度需要在min和max之間
這是怎么回事呢?
把相關(guān)配置貼一下
<!-- 只搜索@Controller 標(biāo)注的類 不搜索其他標(biāo)注的類 -->
<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">
<!-- 默認(rèn)語言為中文 -->
<property name="defaultLocale" value="zh"/>
</bean>
<!-- 國際化操作 攔截器 必需配置,可以和其它國際化方式通用, 用于監(jiān)聽瀏覽器端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>
再加上上邊已經(jīng)貼過的代碼也就沒什么了 在一個就是<!--異常處理--> 但和這個沒有關(guān)系
<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
個數(shù)必須在min和max之間
長度需要在min和max之間
這是怎么回事呢?
把相關(guān)配置貼一下
<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
個數(shù)必須在min和max之間
長度需要在min和max之間
這是怎么回事呢?
如果僅僅是 用戶輸入為空,前臺只提示 用戶名不能為空,不提示 關(guān)于@Length與@Pattern改如何做到
這個目前我知道的是 做不到;
感謝你的回復(fù)。貌似默認(rèn)是哪個錯了提示哪個。還要再確定下。
如果僅僅是 用戶輸入為空,前臺只提示 用戶名不能為空,不提示 關(guān)于@Length與@Pattern改如何做到
這個目前我知道的是 做不到;
如果僅僅是 用戶輸入為空,前臺只提示 用戶名不能為空,不提示 關(guān)于@Length與@Pattern改如何做到
那個是在google code上 你多試幾次試試
明明是在github上啊,地址是https://github.com/zhangkaitao/es ,驗證碼那個jar包如果maven倉庫沒有的話,我去哪里找?
github上只是項目托管; 依賴還是從其他倉庫下的; 驗證碼那個目前我知道的只有g(shù)oogle 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
你給的網(wǎng)址,能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
這篇文章里的
那個是在google code上 你多試幾次試試
明明是在github上啊,地址是https://github.com/zhangkaitao/es ,驗證碼那個jar包如果maven倉庫沒有的話,我去哪里找?
github上只是項目托管; 依賴還是從其他倉庫下的; 驗證碼那個目前我知道的只有g(shù)oogle 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
你給的網(wǎng)址,能fanqiang訪問的,可以訪問,我是去下載:/maven/repo/com/googlecode/maven-db-plugin/1.4-SNAPSHOT/maven-db-plugin-1.4-SNAPSHOT.jar,是這個jar包嗎?