下面将自定义注解使用在springMVC中的后台框架验证:
1.准备以下jar包:
Bean Validation(JSR 303)——Java EE 6的一个核心特性,它为实体验证定义了一个元数据模型和API。其默认的元数据源是注解,但开发者可以通过XML描述符对其进行扩展。Validation API并不依赖特定的应用层或是编程模型,这样同一套验证可由应用的所有层共享。它还提供了通过扩展Validation API来增加客户化验证约束的机制以及查询约束元数据仓库的手段。
在JEE6的Bean Validation出现之前,开发者不得不在表示层框架、业务层以及持久层中编写验证规则以保证这些规则的同步性,但这么做非常浪费时间而且极易出错。Bean Validation是通过约束实现的,这些约束以注解的形式出现,注解可以放在JavaBean(如backing bean)的属性、方法或是类上面。 约束既可以是内建的注解(位于javax.validation.constraints包下面),也可以由用户定义。
Validation API
开发者可以借助于Validation API以编程的方式验证JavaBean。Bean Validation API的默认包是javax.validation。下面对该包中的一些类进行说明:
ConstraintValidator:这是一个接口,具体的约束验证类需要实现该接口。该接口定义了相关的逻辑以验证给定对象类型中的约束。
Validator:Validahttp://java.sun.com/javaee/6/docs/api/index.html?javax/validation/Validator.htmltor接口持有对象验证图的契约。该接口的实现必须是线程安全的。
ConstraintViolation:ConstraintViolation接口表示给定bean上的约束验证失败,它公开了约束违背上下文以及描述该违背情况的信息。
ValidationException:如果在验证过程中出现了某些不可恢复的错误就会抛出ValidationException异常。某些情况下可以指定该异常,如不合法的分组(group)定义、不合法的约束定义以及不合法的约束声明等等。
约束元数据请求API
Bean Validation规范提供了查询约束仓库的手段。该API主要用于工具支持和与其他框架、库以及JSR的集成。Bean Validation规范旨在为对象约束提供一个验证引擎和元数据仓库。需要进行约束定义、验证和元数据的框架(Java EE或Java SE)可以利用Bean Validation规范完成这些功能,从应用或是基础设施的角度来看,这么做可以避免不必要的重复工作。
Bean Validation已经集成到了JSF 2.0和JPA 2.0中。在JSF中可以将表单输入域与域对象的属性绑定起来。JSF 2和Bean Validation可以判断出绑定的是哪个属性并执行与之相关的验证,还会将约束违背的信息显示给用户。
Hibernate Validator 4是Bean Validation规范的参考实现框架,其最新版增加了不少新特性,如分组验证、与JPA 2和JSF 2的自然集成以及扩展的注解集等等。
2.利用自定义注解的知识,可以自定义一些需要的基本验证
demo:
DateFormat.java
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
@Constraint(validatedBy= {DateValidator.class})
public @interface DateFormat {
public String message() default "{valid.hello.register.date.error}";
public String format() default "yyyy-MM-dd";
public Class<?>[] groups() default {};
public Class<? extends Payload>[] payload() default {};
}
DateValidator.java
public class DateValidator implements ConstraintValidator<DateFormat,Date>{
private static final Logger logger = Logger.getLogger(DateValidator.class);
private SimpleDateFormat sdf;
public void initialize(DateFormat annoation) {
this.sdf = new SimpleDateFormat(annoation.format());
}
public boolean isValid(Date date, ConstraintValidatorContext context) {
try {
logger.debug("value={}"+sdf.format(date));
return Pattern.matches("^\\d{4}-\\d{2}-\\d{2}$", sdf.format(date));
} catch (Exception e) {
return false;
}
}
}
UserVo.java
public class UserVo {
private Integer id;
@DateFormat(format="yyyy-MM-dd hh:mm:ss")
private Date date;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
这样使用自定义注解结合validation-api可以在项目中实现后台框架验证。