Estoy trabajando en una aplicación Spring MVC + Hibernate + JPA con un formulario de registro de usuario y decidí usar un validador JSR-303 para verificar si el nombre de usuario ya existía en el PP:@Autowired Bean funciona con @Valid en el controlador pero falla con el repositorio de CRUD
public class UniqueUsernameValidator implements ConstraintValidator<VerifyUniqueUsername, String> {
@Autowired
UserService userService;
@Override
public void initialize(VerifyUniqueUsername constraintAnnotation) {
}
@Override
public boolean isValid(String username, ConstraintValidatorContext context) {
return username!=null && userService.findByUsername(username) == null;
}
}
es muy sencillo y validación funcionó muy bien en mi controlador:
....
public String signup(@Valid @ModelAttribute("newUser") User user, BindingResult newUserBeanResult)
.....
el problema actual que estoy enfrentando es que después de obtener mi objetivo User
validado y yo llame al:
userService.save(user);
Que implementa CrudRepository
, obtengo un NullPointerException
. Por alguna razón, UserService
se inyecta durante la validación en el controlador pero no cuando llamo al CrudRepository.save()
.
vi mensajes similares como este: @Autowired bean null in ConstraintValidator when invoked by Sessionfactory.getCurrentSession.merge Y esto: hibernate validator without using autowire pero me preguntaba si alguien se ha topado con esto antes. Creo que inyectar frijoles para acceder a la base de datos en un validador es bastante común.
Como una solución agregué un cheque para null en userService
pero no se siente bien.
- ¿Este comportamiento es esperado? ¿Se supone que estas validaciones se dispararán antes de llamar al
CrudRepository.save()
? - ¿Se supone que debo manejar eventos de Hibernación "manualmente"? En este caso
pre-insert
gracias por la sugerencia, soy bastante nuevo en Spring. Voy a buscar en Google para @Configurable y me pondré en contacto con ustedes. Gracias. – Ulises
No he tenido mucha suerte, si me puedes indicar dónde podría leer más acerca de esto sería genial. ¡Gracias! – Ulises
http://stackoverflow.com/questions/4703206/spring-autowiring-using-configurable - esta pregunta tiene más detalles sobre cómo configurar @Configurable. Se usa para entidades: lo mismo debería funcionar también para los Validadores. – gkamal