使用Bean验证覆盖或禁用CDI集成

时间:2017-02-18 14:13:29

标签: java cdi interceptor bean-validation websphere-liberty

据我所知,在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配置文件作为应用程序服务器。

提前谢谢。

修改

为了更准确,这是摘录自:https://docs.jboss.org/hibernate/validator/5.1/reference/en-US/html/validator-integration.html#section-integration-with-cdi

  

从版本1.1开始,Bean Validation与CDI集成(上下文   和JavaTM EE的依赖注入。)

     

此集成为Validator和。提供CDI托管bean   ValidatorFactory并在约束中启用依赖项注入   验证器以及自定义消息插值器,可遍历   解析器,约束验证器工厂和参数名称   提供者。

     

此外,方法和参数和返回值约束   CDI托管bean的构造函数将自动进行验证   调用

     

当您的应用程序在Jave EE容器上运行时,默认情况下会启用此集成。

我的问题是,是否有任何方法可以禁用此默认行为?或者在替代方案中,我可以覆盖默认的CDI拦截器吗?或者这是不可能的?

1 个答案:

答案 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注释。