1、新增变化
1.1 依赖注入
Bean Validation使用组件MessageInterpolator, TraversableResolver, ParameterNameProvider, ConstraintValidatorFactory和ConstraintValidator。
Bean Validation 1.1标准化了容器管理对象的使用方式以及这些对象如何从容器服务中受益
1.2 方法验证
支持方法及构造函数的参数及返回值约束。
1.3 集成上下文及依赖注入
与上下文和依赖项注入(CDI)的集成点已经增加和修改。这在JavaEE和JavaSE中实现更自然、更标准的集成,包括依赖注入、组件生命周期管理和方法验证拦截
1.4 组转换
该规范提供了一种在发生验证级联时更改目标组的方法。此功能是对于重用给定对象(图)和避免不同对象子图之间的组泄漏特别有用。还可以创建更可读的约束
1.5 一致表达式语言消息插值
约束冲突消息现在可以使用EL表达式进行更灵活的渲染和字符串格式设置。特别是在EL上下文中注入格式化程序对象,以将数字、日期等转换为特定于语言环境的字符串表示形式。同样,验证值在EL上下文中也可用
2、约束定义
2.1 约束注解
新增
ConstraintTarget validationAppliesTo() default ConstraintTarget.IMPLICIT;
validationAppliesTo仅应该出现在泛型或者交叉参数约束中。ConstraintTarget类型有
public enum ConstraintTarget {
IMPLICIT,
RETURN_VALUE,
PARAMETERS
}
2.2 接口变化
ConstraintValidatorContext新增T unwrap(Class<T> type)
ConstraintViolationBuilder新增
NodeBuilderCustomizableContext addPropertyNode(String name);
LeafNodeBuilderCustomizableContext addBeanNode();
NodeBuilderDefinedContext addParameterNode(int index);
ConstraintValidatorFactory新增
void releaseInstance(ConstraintValidator<?, ?> instance)
3、约束声明以及验证过程
3.1 组转换
执行级联验证时,@ConvertGroup注解。
@Target({ TYPE, METHOD, FIELD, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
public @interface ConvertGroup {
Class<?> from();
Class<?> to();
@Target({ TYPE, METHOD, FIELD, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
public @interface List {
ConvertGroup[] value();
}
}
有多个转换规则,而from是相同时是不合法的
from不能指向组序列
3.2 方法和构造函数约束
3.2.1 方法验证的要求
静态方法不参与验证
3.2.2 声明参数约束
放在方法或者构造函数参数上
3.2.3 交叉参数约束
用于表示基于方法参数值的约束,在方法或者构造函数上声明。
在没有参数的方法或者构造函数上声明交叉参数约束不合法,会抛ConstraintDeclarationException异常
3.2.4 命名参数
3.2.5 继承体系下的方法约束
前置条件在子类型中不应该增强
后置条件在子类型中不应该减弱
4、Validation API
Validator新增
ExecutableValidator forExecutables()
ConstraintViolation新增
Object[] getExecutableParameters();
Object getExecutableReturnValue();
<U> U unwrap(Class<U> type);
5、Constraint metadata request APIs
参考资料: