据我所知,在JEE7中,Bean验证自动与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注释结合使用,以使验证行为多样化。
那么,有没有办法实现我的目标? 或者作为替代方案,我可以禁用与bean验证的CDI集成吗?我可以用自定义实现覆盖默认的CDI javax.validation.Validator吗?
我使用WebSphere Liberty配置文件作为应用程序服务器。
提前谢谢。
修改:
从版本1.1开始,Bean Validation与CDI集成(上下文 和JavaTM EE的依赖注入。)
此集成为Validator和。提供CDI托管bean ValidatorFactory并在约束中启用依赖项注入 验证器以及自定义消息插值器,可遍历 解析器,约束验证器工厂和参数名称 提供者。
此外,方法和参数和返回值约束 CDI托管bean的构造函数将自动进行验证 调用
当您的应用程序在Jave EE容器上运行时,默认情况下会启用此集成。
我的问题是,是否有任何方法可以禁用此默认行为?或者在替代方案中,我可以覆盖默认的CDI拦截器吗?或者这是不可能的?
答案 0 :(得分:2)
尝试使用@ConvertGroup来达到预期效果。
在前一个示例的基础上,代码看起来像这样。
public class SoccerPlayerProcessor {
public void processPlayer(@Valid @ConvertGroup(from=Default.class, to=GoalKeeper.class) SoccerPlayer player){
// Do stuff with the player.
}
如果您需要多个@ConvertGroup,请使用@ConvertGroup.List为同一元素保存多个@ConvertGroup注释。