【发布时间】:2017-07-08 01:26:36
【问题描述】:
据我所知,在 JEE7 中,Bean Validation 自动与 CDI 集成。 例如,如果我使用 CDI 容器,我不需要注入和使用 javax.validation.Validator 来检查我的 bean 是否违反了某些约束。 所以,我不需要做这样的事情:
@Inject
Validator validator;
...
SoccerPlayer player = new SoccerPlayer();
player.setFirstName(firstName);
player.setLastName(lastName);
player.setAge(age);
Set<ConstraintViolation<SoccerPlayer>> violations = validator
.validate(player);
但是下面的 SoccerPlayer bean
public class SoccerPlayer {
@NotNull
@Size(min = 5)
private String firstName;
@NotNull
@Size(min = 5)
private String lastName;
@Max(50)
@Min(value=16, groups = GoalKeeper.class)
private int age;
private String position;
public SoccerPlayer() {
}
// Getters and setters omitted
}
可以使用@Valid 注解自动验证。
public class SoccerPlayerProcessor {
public void processPlayer(@Valid SoccerPlayer player){
// Do stuff with the player.
}
}
现在在这种情况下,我不能将组与 @Valid 注释结合使用,以使验证行为多样化。
那么,有什么方法可以实现我的目标吗? 或者作为替代方案,我可以禁用 CDI 与 bean 验证的集成吗?我可以用我的自定义实现覆盖默认 CDI javax.validation.Validator 吗?
我使用 WebSphere Liberty Profile 作为应用服务器。
提前谢谢你。
编辑:
从 1.1 版开始,Bean Validation 与 CDI(上下文 和 JavaTM EE 的依赖注入)。
此集成为 Validator 和 ValidatorFactory 并在约束中启用依赖注入 验证器以及自定义消息插值器,可遍历 解析器、约束验证器工厂和参数名称 供应商。
此外,方法的参数和返回值约束以及 CDI 托管 bean 的构造函数将自动验证 调用。
当您的应用程序在 Jave EE 容器上运行时,默认情况下会启用此集成。
我的问题是,有什么方法可以禁用此默认行为吗?或者,我可以覆盖默认的 CDI 拦截器吗?还是不可能?
【问题讨论】:
-
“我不能将组与
@Valid注释结合使用”是什么意思? -
我的意思是如果我想用 GoalKeeper.class 组验证 SoccerPlayer 怎么办? AFAIK 我不能做类似@Valid(groups=GoalKeeper.class) 的事情。如果我可以覆盖默认验证器,我可以使用自定义注释来注释我的 API(例如具有组字段 @Validate(groups=GoalKeeper.class) 的验证),并且在验证器中我可以收集所有用它注释的 bean 并执行验证特定组。
标签: java cdi interceptor bean-validation websphere-liberty