[有书共读]JavaWeb高级编程

JavaWeb高级编程 -- 篇13

Bean验证通过为字段、方法等添加注解的方式,指示如何在被标注的目标上应用特定的约束。所有保留策略是运行时并且被标注了@javax.validation.Constraint的注解都代表了一个约束注解。该API中包含了几个预定义的约束注解,我们也可以创建自己的注解并提供对应的javax.validation.ContraintValidator实现,用于处理自定义的注解。ContraintValidator负责评估特定的约束类型。
约束注解可以被添加到字段、方法和方法参数上。添加到字段上时,它表示无论何时在该类的实例调用验证方法,验证器都应该检查字段是否满足约束兼容性。添加在JavaBean访问方法上时,它只是标注底层字段的另一种可选方式而已。在接口方法上添加注解,表示约束应该被应用到方法执行之后的返回值上。在接口的一个或多个方法参数上添加注解,意味着约束应该在方法执行之前作用于方法参数之上。
Spring Framework将自动为使用Java Bean验证的、由Spring管理的bean创建***。它将拦截对添加了注解的方法的调用并进行适当的验证,检查使用者是否提供了有效的参数或该实现的返回值是否有效。
Spring Framework在Bean Validation正式出现很早之前,就已经提供了对对象自动验证的支持org.springframework.valization.Validator接口根据注解约束制定了验证对象的工具。
在配置Spring Framework的验证支持时,需要定义一个同时实现Valization 和Spring Validator的特殊类型bean。
在大多数情况下,我们需要使用LocalValizationFactoryBean,因为它支持获取底层的Validator,并且支持使用应用程序的其他部分代码中应用国际化的相同MessageSource和资源包文件。
LocalValidatorFactoryBean将自动检测到类路径上的Bean Validation实现,无论是Hibernate Validator还是一些其他的实现,并使用它默认的javax.validation.ValidatorFactory作为支持工厂。不需要创建META-INF/validation.xml文件。不过,有时类路径上可能存在多个Bean验证提供者。在这些情况下,Spring选择使用哪个提供者是不可预测的,所以如果希望使用指定的提供者的话,应该手动设置提供者类。

@Bean public LocalValidatorFactoryBean localValidatorFactoryBean()
{
    LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
    validator.setProviderClass(HibernateValidator.class);
    return validator;
}

Spring Framework使用了bean后处理器的概念,通过它可以在容器完成启动过程之前配置、自定义和替换配置中的bean。已配置的org.springframework.beans.factory.config.Bean-PostProcessor实现将在bean被注入到依赖它的其他bean之前执行。
你随时可以创建自己的约束注解,但Bean Validation API中已经提供了几个内建的注解,它们可以满足大多数常见的验证需求。所有这些约束都在javax.validation.constraints包中。
将限制注解用于方法验证时,必须总是标注在接口上,而不是实现上。
如果希望指定应该在方法执行时应用的验证组,可以在类上使用@javax.validation.GroupSequence和@ValidateOnExecution。另一方面,通过@Validated可以直接在其中指定验证组,而无须使用额外的注解,另外它可以为同一个控制器类中的不同MVC控制器方法参数指定不同的组。
如果只希望验证特定分组中的限制,那么可以在@Validated注解中指定这些分组。

@Validated({Default.class, Group.class})
public interface EmployeeService
{
...
}

在Bean验证中,限制可以继承另一个限制。当然,这与类的继承不同,因为注解是不能继承的。不过,根据惯例,限制注解通常包含一个目标ElementType.ANNOTATION_TYPE。在定位到限制注解时,Validator将决定注解定义上是否标注了任何其他限制。如果是这样,它将把所有的额外限制和原始限制中定义的逻辑合并成一个复合限制。在这种情况下,限制继承了它被标注的所有限制。如果出于某些原因需要创建一个不能被继承的限制,那么只需要在定义中忽略ElementType.ANNOTATION_TYPE即可。

#Java##读书笔记#
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务