2012-11-12 1 views
11

좋은 오후, 나는 콩 검사기 (JSR 303) 내에서 서비스를 주입하는 데 문제가ConstraintValidator에 주입한다 서비스 [콩 검사기 - JSR 303] 봄

. 유효성 검사를 수행 할 것이지만 데이터베이스에서이 레코드의 유효성을 검사해야합니다.

내 서비스를 사용할 때 NullPointerException을 throw합니다.

예외 :

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; 
    } 
} 
} 
+0

Spring MVC를 사용하고 계시다면, Spring MVC의 설정을 보여 주실 수 있습니다. –

답변

11

당신은 당신의 Spring 애플리케이션 컨텍스트에 LocalValidatorFactoryBean를 설정해야합니다 참조하십시오.

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

1

@Pangea에서 언급했듯이 지금은 사용자 정의 ConstraintValidatorFactory을 작성해야합니다. 그러나 귀하의 정보를 위해서 Bean Validation 1.1은 ConstraintValidatorFactory에 주입 할 수 있습니다. 당신이 의존성 주입을 통해 Validator (및 ValidatorFactory) 인스턴스를 검색 할 수 있도록도 https://hibernate.onjira.com/browse/BVAL-238