복붙노트

[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. ==============================

    1.의존성 삽입을 통해 Validator (및 ValidatorFactory) 인스턴스를 검색 할 수 있도록 Spring 응용 프로그램 컨텍스트에 LocalValidatorFactoryBean을 설정해야합니다.

    의존성 삽입을 통해 Validator (및 ValidatorFactory) 인스턴스를 검색 할 수 있도록 Spring 응용 프로그램 컨텍스트에 LocalValidatorFactoryBean을 설정해야합니다.

    기본적으로 Pangea가 지적한 바와 같이 유효성 검사기 구현에 종속성 삽입 서비스를 제공하는 SpringConstraintValidatorFactory를 사용하여 유효성 검사기를 얻습니다.

  2. ==============================

    2.종속성을 연결하려면 ConstraintValidatorFactory를 작성하거나 SpringConstraintValidatorFactory를 사용하십시오.

    종속성을 연결하려면 ConstraintValidatorFactory를 작성하거나 SpringConstraintValidatorFactory를 사용하십시오.

  3. ==============================

    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도 참조하십시오.

  4. from https://stackoverflow.com/questions/13350537/inject-service-in-constraintvalidator-bean-validator-jsr-303-spring by cc-by-sa and MIT license