Ví dụ này hơi bị giả tạo; Tôi đã đơn giản hóa nó để loại bỏ các chi tiết không liên quan và tập trung vào vấn đề tôi đang gặp phải. Tôi có một validator trông như thế này:Tự động dịch vụ vào bộ xác thực
@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);
}
}
tôi gọi là validator từ bộ điều khiển của tôi như thế này:
@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);
}
Tuy nhiên, tôi tiếp tục nhận một ngoại lệ NullPointerException
. Tôi đã thêm điểm ngắt trong trình xác thực của mình và thấy rằng usernameService
là null
. Tại sao nó không nhận được autowired? Ban đầu tôi nghĩ rằng đó là vì tôi đã không chú thích trình xác nhận với @Component
, nhưng tôi vẫn có cùng một vấn đề ngay cả sau khi chú thích nó. Lớp UsernameService
đã được chú thích với @Service
và tôi có thể xác minh rằng hàm tạo của nó đang được gọi.
Tôi mới làm quen với Spring, vì vậy tôi thậm chí không chắc chắn có thể kết nối dịch vụ vào trình xác thực hay không. Tôi đang làm gì sai?
Cảm ơn bạn! Đó chính xác là những gì tôi đang tìm kiếm. Tôi đã đi qua tài liệu tham khảo nhưng tôi đã tìm kiếm những thứ như "dịch vụ autowiring thành ràng buộc". Cảm ơn một lần nữa! –
Tôi thích chỉnh sửa với @Valid. Chúc các bạn có thể upvote nhiều hơn một lần :) –
Cảm ơn rất nhiều, câu trả lời của bạn đã giúp tôi tiết kiệm thời gian! –