gpt4 book ai didi

java - 覆盖或禁用 CDI 与 Bean 验证的集成

转载 作者:行者123 更新时间:2023-12-02 03:02:02 25 4
gpt4 key购买 nike

据我所知,在 JEE7 中,Bean Validation 自动与 CDI 集成。例如,如果我使用 CDI 容器,我不需要注入(inject)并使用 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

As of version 1.1, Bean Validation is integrated with CDI (Contexts and Dependency Injection for JavaTM EE).

This integration provides CDI managed beans for Validator and ValidatorFactory and enables dependency injection in constraint validators as well as custom message interpolators, traversable resolvers, constraint validator factories and parameter name providers.

Furthermore, parameter and return value constraints on the methods and constructors of CDI managed beans will automatically be validated upon invocation.

When your application runs on a Jave EE container, this integration is enabled by default.

我的问题是,有什么方法可以禁用此默认行为吗?或者我可以覆盖默认的 CDI 拦截器吗?还是不可能?

最佳答案

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

关于java - 覆盖或禁用 CDI 与 Bean 验证的集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42316233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com