gpt4 book ai didi

jakarta-ee - Glassfish 4.0 中的 Bean-Validation 1.1 - CDI 注入(inject)未按预期工作

转载 作者:行者123 更新时间:2023-12-04 04:17:28 26 4
gpt4 key购买 nike

根据 Glassfish 4.0 wiki,Glassfish 4.0 应该包含 JSR349 Bean Validation 1.1。:GF4 wiki link

根据 JSR349 规范,CDI 注入(inject)应该开箱即用:Bean Validation 1.1. CDI Integration

所以我相应地改变了我的 pom.xml:

<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
<scope>provided</scope>
</dependency>

并尝试将 CDI Bean 注入(inject) ConstraintValidator:
public class UniqueEmaiValidator implements ConstraintValidator<UniqueEmail, String> {

@Inject
private UserAccountService accountService;

@Override
public void initialize(UniqueEmail constraintAnnotation) {
}

@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return !accountService.userExistsByEmail(value);
}
}

但是,在测试应用程序时(使用 arquillian-glassfish-remote-3.1 1.0.0.CR4 运行 Arquillian 1.1.1),验证将始终失败,因为 userAccountService为空,因此将抛出 NullPointerException最终。

为了使 Bean Validation 1.1 正常工作,我缺少什么?

编辑:

A) 可以确认它不是由 Arquillian 远程测试引起的 - 也会引发 NPEx。在服务器上运行时

B) 在 GlassFish Server Open Source Edition 4.0 (build 89) 上运行

C) 我使用 Hibernate Validator 的 5.0.1.FINAL 明确地重新构建了 bean-validation.jar。 mvn package输出:
[INFO] Building Validation API (JSR 349) version 1.1.0.Final, Hibernate Validator version 5.0.1.Final and its dependencies repackaged as OSGi bundle 2.1.92
GlassFish 服务器启动后,我收到以下信息:
INFO:   GlassFish Server Open Source Edition  4.0  (89) startup time : Felix (5,736ms), startup services(2,078ms), total(7,814ms)
INFO: HV000001: Hibernate Validator 5.0.1.Final

所以我想重建确实奏效了。但是,它并没有解决我的 NullPointerException 问题:/

D)@Gunnar

这是实体类,使用 @Constraint注解:
@Entity
public class UserAccount extends AbstractEntity implements VisibilitySettings {

@UniqueEmail
private String email;
[...]
}

注释本身:
@Constraint(validatedBy = {UniqueEmailValidator.class})
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UniqueEmail {

String message() default "{validator.security.useraccount.emailexists}";

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};
}

以及对应的 ConstraintValidator :
public class UniqueEmailValidator implements ConstraintValidator<UniqueEmail, String> {

@Inject
private UserAccountService accountService;

@Override
public void initialize(UniqueEmail constraintAnnotation) {
}

@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return !accountService.userExistsByEmail(value);
}
}
UserAccountService注释为 @ApplicationScoped @Transactional

最佳答案

通过 Validation.buildDefaultValidatorFactory() 手动引导验证器时,CDI 集成无法开箱即用。 .

当通过 JPA 作为实体生命周期的一部分执行验证时,CDI 集成应该可以工作;如果没有,那么如何将 Bean Validation 集成到 GlassFish 中可能仍然存在问题。如果确实如此,您可以通过在 META-INF/validation.xml 中配置自定义约束验证器工厂来解决此问题。它创建 CDI 托管验证器实例。

为此,您可以使用 the factory由 Hibernate Validator 的 CDI 集成作为起点提供。请注意,尽管通过 XML 配置时,工厂需要一个默认构造函数;要满足该要求,您可以引用 BeanManager通过 JNDI。

关于jakarta-ee - Glassfish 4.0 中的 Bean-Validation 1.1 - CDI 注入(inject)未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19925540/

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