私はHibernateとSpring Annotationsを使って多くの検証を行っています:
_public class Account {
@NotEmpty(groups = {Step1.class, Step2.class})
private String name;
@NotNull(groups = {Step2.class})
private Long accountNumber;
public interface Step1{}
public interface Step2{}
}
_
そして、コントローラーで引数で呼び出されます:
_public String saveAccount(@ModelAttribute @Validated({Account.Step1.class}) Account account, BindingResult result) {
//some more code and stuff here
return "";
}
_
しかし、コントローラーメソッドのロジックに基づいて、使用するグループを決定したいと思います。検証を手動で呼び出す方法はありますか? result = account.validate(Account.Step1.class)
のようなものですか?
独自のValidatorクラスを作成することは承知していますが、これは避けたいものです。クラス変数自体のアノテーションを使用することをお勧めします。
彼の答えでJaiwo99よりさらに一歩進んだ:
// org.springframework.validation.SmartValidator - implemented by
// LocalValidatorFactoryBean, which is funny as it is not a FactoryBean per se (just saying)
@Autowired
SmartValidator validator;
public String saveAccount(@ModelAttribute Account account, BindingResult result) {
// ... custom logic
validator.validate(account, result, Account.Step1.class);
if (result.hasErrors()) {
// ... on binding or validation errors
} else {
// ... on no errors
}
return "";
}
SmartValidator JavaDocへの必須リンク 興味がある場合。
JSR 303 spec のコードサンプルを次に示します。
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Driver driver = new Driver();
driver.setAge(16);
Car porsche = new Car();
driver.setCar(porsche);
Set<ConstraintViolation<Driver>> violations = validator.validate( driver );
そのため、はい、バリデーターファクトリーからバリデーターインスタンスを取得し、自分で検証を実行し、違反があるかどうかを確認できます。 Validatorのjavadoc で、検証するグループの配列も受け入れることがわかります。
明らかにこれは、Spring検証を通過する代わりにJSR-303検証を直接使用しますが、クラスパスで見つかった場合、春検証アノテーションはJSR-303を使用すると信じています
すべてが正しく構成されている場合、これを行うことができます:
@Autowired
Validator validator;
次に、それを使用してオブジェクトを検証できます。
そしてまた:
@Autowired
@Qualifier("mvcValidator")
Validator validator;
...
violations = validator.validate(account);