[SPRING] 봄 - ConstraintValidator [JSR 303 콩 검사기]에 서비스를 주입
SPRING봄 - ConstraintValidator [JSR 303 콩 검사기]에 서비스를 주입
안녕하세요,
Bean Validator (JSR 303) 내에 서비스를 삽입하는 데 문제가 있습니다. 유효성 검사를 수행 할 것이지만 데이터베이스에서이 레코드의 유효성을 검사해야합니다.
내 서비스를 사용할 때 NullPointerException을 발생시킵니다.
예외:
Exception in thread "main" javax.validation.ValidationException: HV000028: Unexpected exception during isValid call.
at org.hibernate.validator.internal.engine.ConstraintTree.validateSingleConstraint(ConstraintTree.java:294)
at org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:164)
at org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:125)
at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:86)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:442)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:387)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:351)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:303)
at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:133)
at net.pontoall.hemisphere.core.validation.impl.TesteValidator.main(TesteValidator.java:25)
Caused by: java.lang.NullPointerException
at net.pontoall.hemisphere.core.validation.impl.UsuarioValidatorImpl.doCheckLogin(UsuarioValidatorImpl.java:48)
at net.pontoall.hemisphere.core.validation.impl.UsuarioValidatorImpl.isValid(UsuarioValidatorImpl.java:26)
at net.pontoall.hemisphere.core.validation.impl.UsuarioValidatorImpl.isValid(UsuarioValidatorImpl.java:1)
at org.hibernate.validator.internal.engine.ConstraintTree.validateSingleConstraint(ConstraintTree.java:291)
... 9 more
주석:
@Target(value = ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = UsuarioValidatorImpl.class)
public @interface UsuarioValidator {
String message() default "{net.pontoall.hemisphere.validation.UsuarioValidator.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
ValidatorImpl :
public class UsuarioValidatorImpl implements ConstraintValidator<UsuarioValidator, Usuario> {
@Autowired
private IUsuarioService service;
@Override
public void initialize(UsuarioValidator arg0) {
}
@Override
public boolean isValid(Usuario entidade, ConstraintValidatorContext ctx) {
try {
return (this.doCheckLogin(entidade, ctx) && this.doCheckEmail(entidade, ctx));
} catch (HemisphereException e) {
e.printStackTrace();
return false;
}
}
private boolean doCheckLogin(Usuario entidade, ConstraintValidatorContext ctx) throws HemisphereException {
ctx.buildConstraintViolationWithTemplate("{net.pontoall.hemisphere.validation.UsuarioValidator.login.message}").addConstraintViolation();
if (entidade.getId() == null) {
// Novo Usuário
Usuario original = service.buscarPorLogin(entidade.getLogin());
if (original == null) {
return true;
}
return false;
} else {
Usuario original = service.obter(entidade.getId());
if (original == null) {
return true;
} else {
if (original.getLogin().equals(entidade.getLogin()) && original.getId().equals(entidade.getId())) {
return true;
}
}
return false;
}
}
private boolean doCheckEmail(Usuario entidade, ConstraintValidatorContext ctx) {
ctx.buildConstraintViolationWithTemplate("{net.pontoall.hemisphere.validation.UsuarioValidator.email.message}").addConstraintViolation();
if (entidade.getId() == null) {
// Novo Usuário
Usuario original = service.buscarPorEmail(entidade.getEmail());
if (original == null) {
return true;
}
return false;
} else {
Usuario original = service.obter(entidade.getId());
if (original == null) {
return true;
} else {
if (original.getEmail().equals(entidade.getEmail()) && original.getId().equals(entidade.getId())) {
return true;
}
}
return false;
}
}
}
해결법
-
==============================
1.의존성 삽입을 통해 Validator (및 ValidatorFactory) 인스턴스를 검색 할 수 있도록 Spring 응용 프로그램 컨텍스트에 LocalValidatorFactoryBean을 설정해야합니다.
의존성 삽입을 통해 Validator (및 ValidatorFactory) 인스턴스를 검색 할 수 있도록 Spring 응용 프로그램 컨텍스트에 LocalValidatorFactoryBean을 설정해야합니다.
기본적으로 Pangea가 지적한 바와 같이 유효성 검사기 구현에 종속성 삽입 서비스를 제공하는 SpringConstraintValidatorFactory를 사용하여 유효성 검사기를 얻습니다.
-
==============================
2.종속성을 연결하려면 ConstraintValidatorFactory를 작성하거나 SpringConstraintValidatorFactory를 사용하십시오.
종속성을 연결하려면 ConstraintValidatorFactory를 작성하거나 SpringConstraintValidatorFactory를 사용하십시오.
-
==============================
3.@Pangea에서 언급했듯이, 지금은 사용자 정의 ConstraintValidatorFactory를 작성해야합니다. Bean Validation 1.1은 ConstraintValidatorFactory에 대한 주입을 허용합니다. https://hibernate.onjira.com/browse/BVAL-238도 참조하십시오.
@Pangea에서 언급했듯이, 지금은 사용자 정의 ConstraintValidatorFactory를 작성해야합니다. Bean Validation 1.1은 ConstraintValidatorFactory에 대한 주입을 허용합니다. https://hibernate.onjira.com/browse/BVAL-238도 참조하십시오.
from https://stackoverflow.com/questions/13350537/inject-service-in-constraintvalidator-bean-validator-jsr-303-spring by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] cvc-complex-type.2.4.c : 일치하는 와일드 카드가 엄격하지만 'mvc : annotation-driven'요소에 대한 선언을 찾을 수 없습니다. (0) | 2019.01.19 |
---|---|
[SPRING] UserDetails getPassword는 봄 보안 3.1에서 null을 반환합니다. 현재 로그인 한 사용자의 비밀번호를 얻는 방법은 무엇입니까? (0) | 2019.01.19 |
[SPRING] 유레카 발견 클라이언트 - 선택적 디스 에이블 (0) | 2019.01.19 |
[SPRING] / oauth / token에 유효하지 않은 XSRF 토큰이 있습니다. (0) | 2019.01.19 |
[SPRING] java로 데이터베이스 리스너를 만드는 방법은? (0) | 2019.01.19 |