web-dev-qa-db-ja.com

Spring Annotation Validationを手動で呼び出す

私は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クラスを作成することは承知していますが、これは避けたいものです。クラス変数自体のアノテーションを使用することをお勧めします。

32
Ross Hettel

彼の答えで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への必須リンク 興味がある場合。

39
Pavel Horal

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を使用すると信じています

22
digitaljoel

すべてが正しく構成されている場合、これを行うことができます:

@Autowired
Validator validator;

次に、それを使用してオブジェクトを検証できます。

7
Jaiwo99

そしてまた:

@Autowired
@Qualifier("mvcValidator")
Validator validator;

...
violations = validator.validate(account);
1
supercobra