用Annotations 給類或者類的屬性加上約束(constraint)
Person
/*
* Created on
* @author
*/
package test
import org
import org
import org
//@Serializability //測試自定義約束
public class Person {
private String name;
private int age;
private Address address;
public Person() {}
@Valid //注意此處
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this
}
@Min(value =
public int getAge() {
return age;
}
public void setAge(int age) {
this
}
@Length(min =
public String getName() {
return name;
}
public void setName(String name) {
this
}
}
Address
/*
* Created on
* @author
*/
package test
import org
import org
import org
public class Address {
private String street;
private int num;
public Address() {}
@Min(value =
@Max(value =
public int getNum() {
return num;
}
public void setNum(int num) {
this
}
@Length(min =
public String getStreet() {
return street;
}
public void setStreet(String street) {
this
}
}
上面是兩個用 Validator Annotations 注釋的 類
TestValidator
/*
* Created on
* @author icerain
*/
package test
import org
import org
public class TestValidator {
public void test() {
Address add = new Address();
add
add
Person p = new Person();
p
p
p
/******************Test validator ********/
// 注意該處只驗證了Person 為了說明 @Valid 注釋的使用
ClassValidator<Person> classValidator = new ClassValidator<Person> (Person
InvalidValue[] validMessages = classValidator
for (InvalidValue value : validMessages) {
System
+
+
+
+
+
+
}
}
public static void main(String[] args) {
new TestValidator()
}
}
程序的輸出如下
InvalidValue 的長度是:
PropertyName 是: age
BeanClass 是:class test
InvalidValue 的長度是:
PropertyName 是: name
BeanClass 是:class test
InvalidValue 的長度是:
PropertyName 是: num
BeanClass 是:class test
InvalidValue 的長度是:
PropertyName 是: street
BeanClass 是:class test
可以看出不滿足約束的值都被指出了
同時該句: ClassValidator<Person> classValidator = new ClassValidator<Person> (Person
我們只驗證了 Person
如果 把@Valid Annotations 去掉
InvalidValue 的長度是:
PropertyName 是: age
BeanClass 是:class test
InvalidValue 的長度是:
PropertyName 是: name
BeanClass 是:class test
可以看出 沒有驗證 Address
當然了
InvalidValue[] validMessages = classValidator
運行結果如下:
InvalidValue 的長度是:
PropertyName 是: age
BeanClass 是:class test
只是驗證了 age 屬性
怎麼樣
如果你要寫自己的約束呢
首先: 要聲明一個constraint descriptor
package test
import java
import static java
import static java
import static java
import java
import static java
import java
import org
/**
* Dummy sample of a bean
*
* @author Emmanuel Bernard
*/
@ValidatorClass(SerializabilityValidator
@Target({METHOD
@Retention(RUNTIME)
@Documented
public @interface Serializability {
int num() default
String message() default
}
@ValidatorClass(SerializabilityValidator
@Target({METHOD
@Retention(RUNTIME)
@Documented
這幾個我就不用解釋了吧
Serializability 裡面聲明了一個 message 顯示約束的提示信息
然後就是 實現一個constraint validator 類 該類要實現Validator<ConstraintAnnotation>
//$Id: SerializabilityValidator
package test
import java
import org
/**
* Sample of a bean
*
* @author Emmanuel Bernard
*/
public class SerializabilityValidator implements Validator<Serializability>
public boolean isValid(Object value) {
//這裡只是Validator 裡面的 實現驗證規則的 方法
System
return value instanceof Serializable;
}
public void initialize(Serializability parameters) {
// 在這裡可以 取得 constraint descriptor 裡面的屬性 如上面我們聲明的 num
System
}
}
然後在你的類中應用@Serializability 就可以約束一個類實現Serializable 接口了
在我們的Person
運行結果如下:
InvalidValue 的長度是:
PropertyName 是: null
BeanClass 是:class test
現在把Person類實現 java
消息的國際化也是很簡單的
public @interface Serializability {
int num() default
String message() default
}
然後編輯資料文件
然後在 資源文件中添加 Serializable =
#DefaultValidatorMessages
#下面是 Hibernate Validator 內建的國際化消息
validator
validator
validator
validator
validator
validator
validator
validator
validator
validator
validator
#下面是自定義的消息
Serializable=Bean not Serializable //加上自己定義的國際化消息
在構造ClassValidator 時要添上 資源文件 如下:(在測試類中)
ClassValidator<Person> classValidator = new ClassValidator<Person> (Person
這樣就可以了
myMsg=該字符串的長度不符合規定范圍范圍
並且還要在@Length 注釋中提供message的引用的key 如下@Length(min =
再一次運行測試
InvalidValue 的長度是:
PropertyName 是: null
BeanClass 是:class test
InvalidValue 的長度是:
PropertyName 是: name
BeanClass 是:class test
怎麼樣
上面我們討論了 Hibernate Validator 的主要用法: 但是 該框架有什麼用呢?
看到這裡其實不用我在多說了 大家都知道怎麼用
比如 : 你現在在開發一個人力資源(HR)系統 (其實是我們ERP課程的一個作業 ^_^)
是啊 當就驗證這一個屬性時
你要是每一個都那樣 寫一段驗證代碼 是不是很煩啊
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28573.html