小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

SpringMVC數(shù)據(jù)驗證——第七章 注解式控制器的數(shù)據(jù)驗證、類型轉(zhuǎn)換及格式化——跟著開濤學(xué)SpringMVC

 賈朋亮博客 2015-03-19

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)

Java代碼  收藏代碼
  1. @Controller  
  2. public class RegisterSimpleFormController {  
  3.     private UserModelValidator validator = new UserModelValidator();  
  4.   
  5.     @ModelAttribute("user")        //① 暴露表單引用對象為模型數(shù)據(jù)  
  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 調(diào)用UserModelValidator的validate方法進行驗證  
  18.         if(errors.hasErrors()) { //2如果有錯誤再回到表單展示頁面  
  19.             return showRegisterForm();  
  20.         }  
  21.         return "redirect:/success";  
  22.     }  
  23. }   

在submitForm方法中,我們首先調(diào)用之前寫的UserModelValidator的validate方法進行驗證,當(dāng)然此處可以直接驗證并通過Errors接口來保留錯誤;此處還通過 Errors接口的hasErrors方法來決定當(dāng)驗證失敗時顯示的錯誤頁面。

 

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

Java代碼  收藏代碼
  1. <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

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復(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/lib/required/validation-api-1.0.0.GA.jar JSR-303規(guī)范API包
dist/hibernate-validator-4.3.0.Final.jar Hibernate 參考實現(xiàn)

(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.         <!-- 如果不加默認(rèn)到 使用classpath下的 ValidationMessages.properties -->  
  6.         <property name="validationMessageSource" ref="messageSource"/>  
  7. </bean>   

此處使用Hibernate validator實現(xiàn):

validationMessageSource屬性:指定國際化錯誤消息從哪里取,此處使用之前定義的messageSource來獲取國際化消息;如果此處不指定該屬性,則默認(rèn)到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>   

其他配置和之前學(xué)習(xí)7.2.2.4一節(jié)一樣。

 

如上集成過程看起來比較麻煩,后邊我們會介紹<mvc:annotation-driven>和@EnableWebMvc,ConversionService會自動注冊,后續(xù)章節(jié)再詳細(xì)介紹。

 

(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字段不允許為空,當(dāng)驗證失敗時將從之前指定的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數(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ù)消息鍵讀取錯誤消息。

 

一、硬編碼錯誤消息

直接在驗證約束注解上指定錯誤消息,如下所示:

Java代碼  收藏代碼
  1. @NotNull(message = "用戶名不能為空")  
  2. @Length(min=5, max=20, message="用戶名長度必須在5-20之間")  
  3. @Pattern(regexp = "^[a-zA-Z_]\\w{4,19}$", message = "用戶名必須以字母下劃線開頭,可由字母數(shù)字下劃線組成")  
  4. 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碼):

 

Java代碼  收藏代碼
  1. javax.validation.constraints.Pattern.message=用戶名必須以字母或下劃線開頭,后邊可以跟字母數(shù)字下劃線,長度在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中找,找不到再到默認(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:

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>   

之前我們已經(jīng)配置過了,在此就不詳述了。

 

在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=用戶名必須以字母或下劃線開頭,后邊可以跟字母數(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)的錯誤消息,在大部分場景下,以上兩種方式無法滿足我們的需求,因此我們需要自定義錯誤消息鍵值。

 

在驗證約束注解上指定錯誤消息鍵:

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應(yīng)該是從@Length驗證約束注解中獲取的,而不是在錯誤消息中硬編碼,因此我們需要占位符的支持:

●如@Length(min=5, max=20, message="{user.name.length.error}"),錯誤消息可以這樣寫:用戶名長度必須在{min}-{max}之間

 

錯誤消息占位符規(guī)則:

{驗證注解屬性名},如@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、功能處理方法上多個驗證參數(shù)的處理

當(dāng)我們在一個功能處理方法上需要驗證多個模型對象時,需要通過如下形式來獲取驗證結(jié)果:

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對象來保存驗證結(jié)果,其方法體內(nèi)部可以使用這兩個驗證結(jié)果對象來選擇出錯時跳轉(zhuǎn)的頁面。詳見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 寫道
有個問題請教一下,遇到這么一個問題,數(shù)據(jù)庫有個字段 是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
或者輸入非數(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 試試
91 樓 hquxiezk 2014-03-05  
有個問題請教一下,遇到這么一個問題,數(shù)據(jù)庫有個字段 是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
或者輸入非數(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 不能加,一加就會報錯。
是不是只能自己自定義驗證注解。
90 樓 hellostory 2013-12-16  
你好!請問Ajax提交表單后,驗證消息如何國際化,能否給個DEMO,比較現(xiàn)在Ajax使用越來越頻繁!
89 樓 yulinling1230 2013-11-25  
濤ge好厲害,這要折騰多長時間才能到濤ge這程度?哎,發(fā)了兩遍,有敏感詞匯
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"/>



你好~!我是個初學(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方法
請問還有什么好方法嗎?



你好 我想明白了 謝謝你提供的資料
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"/>



你好~!我是個初學(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方法
請問還有什么好方法嗎?
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 
個數(shù)必須在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 
個數(shù)必須在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 
個數(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它引起的問題
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 
個數(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)信吧
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 
個數(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)系
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 
個數(shù)必須在min和max之間 
長度需要在min和max之間 


這是怎么回事呢?


把相關(guān)配置貼一下
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 
個數(shù)必須在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 = "用戶名必須以字母下劃線開頭,可由字母數(shù)字下劃線組成")    
  4. private String username;  


如果僅僅是 用戶輸入為空,前臺只提示 用戶名不能為空,不提示 關(guān)于@Length與@Pattern改如何做到


這個目前我知道的是 做不到;



感謝你的回復(fù)。貌似默認(rèn)是哪個錯了提示哪個。還要再確定下。
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 = "用戶名必須以字母下劃線開頭,可由字母數(shù)字下劃線組成")    
  4. private String username;  


如果僅僅是 用戶輸入為空,前臺只提示 用戶名不能為空,不提示 關(guān)于@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 = "用戶名必須以字母下劃線開頭,可由字母數(shù)字下劃線組成")    
  4. private String username;  


如果僅僅是 用戶輸入為空,前臺只提示 用戶名不能為空,不提示 關(guān)于@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上只是項目托管; 依賴還是從其他倉庫下的;  驗證碼那個目前我知道的只有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

這篇文章里的
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上只是項目托管; 依賴還是從其他倉庫下的;  驗證碼那個目前我知道的只有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包嗎?

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多