2012-11-12 7 views
11

Guten Tag,Inject-Service in ConstraintValidator [Bean Validator - JSR 303] Frühling

ich Problem habe einen Dienst in einem Bean Validator (JSR 303) zu injizieren. Ich würde eine Validierung durchführen, aber ich muss diesen Datensatz in meiner Datenbank validieren;

Wenn ich meinen Dienst verwende, wird NullPointerException ausgelöst;

Ausnahme:

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 

Annotation:

@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

Verwenden Sie Spring MVC, wenn ja, können Sie auch die Konfiguration von Spring MVC anzeigen –

Antwort

11

Sie sollten eine LocalValidatorFactoryBean in Ihrem Spring-Anwendungskontext einrichten, so dass Sie abrufen können Validator (und ValidatorFactory) Instanzen über Dependency Injection.

standardmäßig eine Prüfung so erhalten nutzt SpringConstraintValidatorFactory die Dienste Dependency Injection zu Constraint-Validator-Implementierungen bietet, wie von Pangea hingewiesen.

1

Wie von @ Pangea erwähnt, müssten Sie jetzt eine benutzerdefinierte ConstraintValidatorFactory schreiben. Nur zu Ihrer Information erlaubt Bean Validation 1.1 die Injektion in die ConstraintValidatorFactory. Siehe auch https://hibernate.onjira.com/browse/BVAL-238

Verwandte Themen