Java EE6核心特徵:Bean Validation

Bean Validation是JavaEE6數據驗證新框架,ValidationAPI並不依賴特定的應用層或是編程模型,這樣同一套驗證可由應用的全部層共享.它還提供了經過擴展ValidationAPI來增長客戶化驗證約束的機制以及查詢約束元數據倉庫的手段. 

  在Java EE6的BeanValidation出現以前,開發者不得不在表示層框架、業務層以及持久層中編寫驗證規則以保證這些規則的同步性,但這麼作很是浪費時間並且極易出錯.BeanValidation是經過約束實現的,這些約束以註解的形式出現,註解能夠放在JavaBean(如backingbean)的屬性、方法或是類上面.約束既能夠是內建的註解(位於javax.validation.constraints包下面),也能夠由用戶定義。一些經常使用的內建註解列舉以下: 

   ◆Min:被@Min所註解的元素必須是個數字,其值要大於或等於給定的最小值。
  ◆Max:被@Max所註解的元素必須是個數字,其值要小於或等於給定的最大值。 
  ◆Size:@Size表示被註解的元素必須位於給定的最小值和最大值之間。支持Size驗證的數據類型有String、Collection(計算集合的大小)、Map以及數組。 
  ◆NotNull:@NotNull確保被註解的元素不能爲null。 
  ◆Null:@Null確保被註解的元素必定爲null。 
  ◆Pattern:@Pattern確保被註解的元素(String)必定會匹配給定的Java正則表達式。  

  代碼中經過BeanValidation註解聲明瞭一些約束: 
        
package org.jboss.as.quickstarts.bean_validation.model;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import javax.persistence.UniqueConstraint;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;

@Entity
@Table(name="MEMBER_BEAN_VALIDATION", uniqueConstraints = @UniqueConstraint(columnNames = "email"))
public class Member implements Serializable {
    /** Default value included to remove warning. Remove or modify at will. **/
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private Long id;

    @NotNull
    @Size(min = 1, max = 25)
    @Pattern(regexp = "[A-Za-z ]*", message = "must contain only letters and spaces")
    private String name;

    @NotNull
    @NotEmpty
    @Email
    private String email;

    @NotNull
    @Size(min = 10, max = 12)
    @Digits(fraction = 0, integer = 12) //限制12位int數字,小數部分爲0位.
    @Column(name = "phone_number")
    private String phoneNumber;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}

以下代碼自定義了一個名爲email的約束(官方源碼):  html


package org.hibernate.validator.constraints;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;

import org.hibernate.validator.constraints.impl.EmailValidator;

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * The string has to be a well-formed email address.
 *
 * @author Emmanuel Bernard
 * @author Hardy Ferentschik
 */
@Documented
@Constraint(validatedBy = EmailValidator.class)
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
public @interface Email {
	String message() default "{org.hibernate.validator.constraints.Email.message}";

	Class<?>[] groups() default { };

	Class<? extends Payload>[] payload() default { };

	/**
	 * Defines several {@code @Email} annotations on the same element.
	 */
	@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
	@Retention(RUNTIME)
	@Documented
	public @interface List {
		Email[] value();
	}
}
@Constraint(validatedBy = EmailValidator.class)的代碼以下:
package org.hibernate.validator.constraints.impl;

import java.util.regex.Matcher;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import org.hibernate.validator.constraints.Email;

/**
 * Checks that a given string is a well-formed email address.
 * <p>
 * The specification of a valid email can be found in
 * <a href="http://www.faqs.org/rfcs/rfc2822.html">RFC 2822</a>
 * and one can come up with a regular expression matching <a href="http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html">
 * all valid email addresses</a> as per specification. However, as this
 * <a href="http://www.regular-expressions.info/email.html">article</a> discusses it is not necessarily practical to
 * implement a 100% compliant email validator. This implementation is a trade-off trying to match most email while ignoring
 * for example emails with double quotes or comments.
 * </p>
 *
 * @author Emmanuel Bernard
 * @author Hardy Ferentschik
 */
public class EmailValidator implements ConstraintValidator<Email, String> {
	private static String ATOM = "[a-z0-9!#$%&'*+/=?^_`{|}~-]";
	private static String DOMAIN = "(" + ATOM + "+(\\." + ATOM + "+)*";
	private static String IP_DOMAIN = "\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\]";

	private java.util.regex.Pattern pattern = java.util.regex.Pattern.compile(
			"^" + ATOM + "+(\\." + ATOM + "+)*@"
					+ DOMAIN
					+ "|"
					+ IP_DOMAIN
					+ ")$",
			java.util.regex.Pattern.CASE_INSENSITIVE
	);

	public void initialize(Email annotation) {
	}

	public boolean isValid(String value, ConstraintValidatorContext context) {
		if ( value == null || value.length() == 0 ) {
			return true;
		}
		Matcher m = pattern.matcher( value );
		return m.matches();
	}
}


Validation API 

  1.   開發者能夠藉助於ValidationAPI以編程的方式驗證JavaBean。BeanValidationAPI的默認包是javax.validation。下面對該包中的一些類進行說明: 
  2.   ConstraintValidator:這是一個接口,具體的約束驗證類須要實現該接口。該接口定義了相關的邏輯以驗證給定對象類型中的約束。 
  3.   Validator:Validahttp://java.sun.com/javaee/6/docs/api/index.html?javax/validation/Validator.htmltor接口持有對象驗證圖的契約。該接口的實現必須是線程安全的。 
  4.   ConstraintViolation:ConstraintViolation接口表示給定bean上的約束驗證失敗,它公開了約束違背上下文以及描述該違背狀況的信息。 
  5.   ValidationException:若是在驗證過程當中出現了某些不可恢復的錯誤就會拋出ValidationException異常。某些狀況下能夠指定該異常,如不合法的分組(group)定義、不合法的約束定義以及不合法的約束聲明等等。 
  約束元數據請求API 
  BeanValidation規範提供了查詢約束倉庫的手段。該API主要用於工具支持和與其餘框架、庫以及JSR的集成。BeanValidation規範旨在爲對象約束提供一個驗證引擎和元數據倉庫。須要進行約束定義、驗證和元數據的框架(JavaEE或JavaSE)能夠利用BeanValidation規範完成這些功能,從應用或是基礎設施的角度來看,這麼作能夠避免沒必要要的重複工做。 

  BeanValidation已經集成到了JSF2.0和JPA2.0中。在JSF中能夠將表單輸入域與域對象的屬性綁定起來。JSF2和BeanValidation能夠判斷出綁定的是哪一個屬性並執行與之相關的驗證,還會將約束違背的信息顯示給用戶。HibernateValidator4是BeanValidation規範的參考實現框架,其最新版增長了很多新特性,如分組驗證、與JPA2和JSF2的天然集成以及擴展的註解集等等。 java

可是,全部的輸入信息源頭基本是用戶,因此前臺的驗證纔是最爲關鍵的. git

相關文章
相關標籤/搜索