【问题标题】:Override or Disable CDI integration with Bean Validation覆盖或禁用 CDI 与 Bean 验证的集成
【发布时间】: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 作为应用服务器。

提前谢谢你。

编辑

更准确地说,这是摘自: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 和 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


【解决方案1】:

尝试使用@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 注释。

【讨论】:

  • 我建议在您的单元测试中使用 validator.forExecutables().validateParameters(..) 方法来检查您的验证是否正常工作。
猜你喜欢
  • 2012-10-05
  • 2016-06-15
  • 1970-01-01
  • 2018-12-11
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多