Согласно вики Glassfish 4.0, Glassfish 4.0 должен включать JSR349 Bean Validation 1.1 .: GF4 wiki linkBean-Validation 1.1 в Glassfish 4.0 - CDI Injection не работает по назначению
Согласно спецификации JSR349, CDI Инъекции должны работать из коробки: 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 в 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);
}
}
Однако при тестировании приложения (Running Arquillian 1.1.1. с arquillian-glassfish-remote-3.1 1.0.0.CR4), валидация всегда будет терпеть неудачу, потому что userAccountService
имеет значение NULL и, таким образом, в конечном итоге выбросит NullPointerException
.
Что мне недостает, чтобы убедиться, что функция проверки фасов 1.1 работает?
редактировать:
A) может подтвердить это не вызвано Arquillian удаленного тестирования - также бросить NPEx. при запуске на сервере
B) Запуск на GlassFish Server, Open Source Edition 4.0 (сборка 89)
C) Я снова построил боб-validation.jar явно с помощью 5.0.1.FINAL из спящего режима Validator. 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
Это должно работать, и есть даже тесты TCK для обеспечения того, что инъекция CDI работает в экземплярах ConstraintValidator. Есть ли что-то еще в журналах, кроме исключения NullPointerException? Включает ли инъекция CDI вне проверки Bean? Восстановление артефактов Glassfish не требуется. Он должен работать из коробки, а Hibernate Validator 5.0.1.Final - это правильная версия. – Hardy
Как вы получаете свой 'Validator', введя его через' @ Inject'? Обратите внимание, что интеграция CDI не будет работать из коробки при ручной загрузке валидатора с помощью 'Validation.buildDefaultValidatorFactory()'. – Gunnar
5.0.0.Финал отлично подходит. 5.0.1.Final - это всего лишь незначительный выпуск технического обслуживания. – Hardy