Este ejemplo es un poco artificial; Lo simplifiqué para eliminar detalles extraños y centrarme en el problema que estoy teniendo. Tengo un validador que tiene este aspecto:autowiring un servicio en un validador
@Component
public class UniqueUsernameValidator implements ConstraintValidator<UniqueUsername, String> {
@Autowired
UsernameService usernameService;
@Override
public void initialize(UniqueUsername uniqueUsername) {
}
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
return !usernameService.exists(s);
}
}
que llamo el validador de mi controlador de la siguiente manera:
@RequestMapping
public void checkUsername(Model model, User user) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<User>> constraintViolations = validator.validateProperty(user, "username");
model.addAttribute("error", constraintViolations.size() > 0);
}
Sin embargo, me siguen dando una excepción NullPointerException
. He añadido un punto de interrupción en mi validador y vi que era usernameService
null
. ¿Por qué no se está autoconectando? Inicialmente pensé que era porque no había anotado el validador con @Component
, pero todavía tengo el mismo problema incluso después de anotarlo. La clase UsernameService
ya se ha anotado con @Service
y puedo comprobar que su constructor está recibiendo llamadas.
Soy nuevo en primavera, así que no estoy seguro si está bien para conectar un servicio en un validador. ¿Qué estoy haciendo mal?
¡Muchas gracias! Eso es exactamente lo que estaba buscando. Estaba revisando la documentación de referencia, pero estaba buscando cosas como "servicios de autoconexión en restricciones". ¡Gracias de nuevo! –
Me gusta la edición con @Valid. Desearía poder votar más de una vez :) –
¡Muchas gracias, su respuesta me ayudó a ahorrar tiempo! –