spring - ¿Cómo inyectar(@Autowired) @Service en ConstraintValidator?
nullpointerexception transactions (1)
Tengo un servicio de usuario que realiza operaciones en la entidad de usuario. Creé mi propia clase de anotación y ConstraintValidator como una implementación
Necesito tener ese UserService inyectado en ConstraintValidator. Y, como dice la primavera, después de registrar bean:
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
SpringConstraingValidatorFactory está registrado por defecto, así que puedo @Autowired fácilmente mi servicio en él. (fuente: http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/validation.html#validation-beanvalidation-spring-constraints )
Desafortunadamente no funciona por mí. Recibo stacktrace con NullPointerException en el campo (dentro de la clase que implementa ConstraintValidator):
@Autowired
private UserService userService; //here
y en la llamada al servicio
@Override
public boolean isValid(String username, ConstraintValidatorContext constraintValidatorContext) {
personService.doSomethingWithService(); //here
return true;
}
Entonces, significa que UserService no se inyectó correctamente. También he intentado usar ApplicationContextAware: implementarlo en mi clase ConstraintValidator, obtener el contexto y encontrar el bean:
(UserService) context.getBean("userService");
Pero tampoco me ayudó ... No tengo idea de qué pasa con mi código. Y finalmente, stacktrace, que contiene muchas excepciones, incluyendo NullPointer y RollbackException.
java.lang.NullPointerException
com.reportme.model.validation.UsernameAvailableValidator.isValid(UsernameAvailableValidator.java:20)
com.reportme.model.validation.UsernameAvailableValidator.isValid(UsernameAvailableValidator.java:9)
org.hibernate.validator.internal.engine.ConstraintTree.validateSingleConstraint(ConstraintTree.java:308)
org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:180)
org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:124)
org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:85)
org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:463)
//...
org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction
org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:526)
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757)
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726)
//...
javax.persistence.RollbackException: Error while committing the transaction
org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:94)
org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517)
Utilizo Spring 4 si es necesario y estaré MUY agradecido por la ayuda, ¡gracias!
mi entorno es Spring-boot, y debajo del código con org.springframework.stereotype.Component
anotación a mi clase de validación está funcionando, FYR.
@Component
public class FooValidator implements ConstraintValidator<Foo, Object> {
@Autowired
MyService service;
@Override
public void initialize(Foo constraintAnnotation) {
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
return service.isValid(value);
}
}