この例は少し不自然です。余分な詳細を削除し、私が抱えている問題に焦点を当てるために、単純化しました。次のようなバリデーターがあります。
@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);
}
}
次のように、コントローラーからバリデーターを呼び出します。
@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);
}
ただし、NullPointerException
例外が発生し続けます。バリデーターにブレークポイントを追加したところusernameService
、null
. 自動配線されないのはなぜですか?最初は、バリデーターに で注釈を付けていないためだと思っていましたが、注釈を付けた@Component
後でも同じ問題が発生します。UsernameService
クラスには既に で注釈が付けられており、@Service
そのコンストラクターが呼び出されていることを確認できます。
私はSpringが初めてなので、サービスをバリデーターに接続しても問題ないかどうかさえわかりません。私は何を間違っていますか?