Dieses Beispiel ist ein bisschen künstlich; Ich habe es vereinfacht, um überflüssige Details zu entfernen und mich auf das Problem zu konzentrieren, das ich habe. Ich habe einen Validator, der wie folgt aussieht:Autowiring eines Dienstes in einen Validator
@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);
}
}
ich den Validator nennen wie dies von meinem Controller:
@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);
}
Allerdings halte ich eine NullPointerException
Ausnahme bekommen. Ich fügte einen Haltepunkt in meinem Prüfer hinzu und sah, dass usernameService
null
war. Warum wird es nicht autowired? Anfangs dachte ich, dass es daran lag, dass ich den Validator nicht mit @Component
annotiert hatte, aber ich habe immer noch das gleiche Problem, selbst nachdem ich es notiert habe. Die UsernameService
Klasse wurde bereits mit @Service
annotiert und ich kann überprüfen, dass der Konstruktor aufgerufen wird.
Ich bin neu bei Spring, also bin ich mir nicht einmal sicher, ob es in Ordnung ist, einen Service in einen Validator einzubinden. Was mache ich falsch?
Vielen Dank! Genau das habe ich gesucht. Ich ging die Referenzdokumentation durch, aber ich suchte nach Dingen wie "Autowinding Services in Constraints". Danke noch einmal! –
Ich mag die Bearbeitung mit der @Valid. Ich wünschte, ich könnte mehr als einmal upvote :) –
Vielen Dank, Ihre Antwort hat mir geholfen, Zeit zu sparen! –