2012-11-12 7 views
11

Good Afternoon,Tiêm dịch vụ trong ConstraintValidator [Bean Validator - JSR 303] Mùa xuân

Tôi đang gặp vấn đề khi tiêm dịch vụ trong Trình xác thực Bean (JSR 303). Tôi sẽ thực hiện xác nhận hợp lệ, nhưng tôi cần xác thực bản ghi này trong cơ sở dữ liệu của mình;

Khi tôi sử dụng dịch vụ của mình, nó sẽ ném NullPointerException;

Ngoại lệ:

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 

chú giải:

@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

Bạn đang sử dụng Spring MVC, nếu có thể bạn vui lòng hiển thị cấu hình của Spring MVC –

Trả lời

11

Bạn nên thiết lập một LocalValidatorFactoryBean trong bối cảnh ứng dụng Spring của bạn, do đó bạn có thể lấy Validator (và ValidatorFactory) trường hợp qua dependency injection.

Theo mặc định trình xác thực có được như vậy sử dụng SpringConstraintValidatorFactory cung cấp các dịch vụ tiêm phụ thuộc để hạn chế việc triển khai trình xác thực, như được chỉ ra bởi Pangea.

1

Như đã đề cập bởi @Pangea, ngay bây giờ bạn sẽ phải viết một tùy chỉnh ConstraintValidatorFactory. Chỉ cho thông tin của bạn, Bean Validation 1.1 sẽ cho phép tiêm vào ConstraintValidatorFactory. Xem thêm https://hibernate.onjira.com/browse/BVAL-238