2016-10-05 25 views
1

私は、検証のために注釈が付けられたオブジェクトのリストを含むコマンドオブジェクトを受け取るコントローラメソッドを持っています。ただし、完全に空の項目は無視する必要がありますので、コントローラーのメソッドヘッダーでは@Validを使用できません。これは、すべてのリスト項目のすべてのフィールドにエラーが発生するためです。Spring MVC:コントローラメソッドの後で手動で検証を開始する方法

空の行をリストから削除し、後でSpringバリデータを呼び出したいと思います。どうやってやるの?

これはSpringブートプロジェクトです。

+1

についての詳細はthisてください行くことができるvalidate()方法

@Autowired private Validator validator; @Autowired private MyCustomValidator customValidator; @InitBinder public void initBinder(WebDataBinder binder) { binder.addValidators(smartValidator, customValidator); } public String save(@ModelAttribute FooModel foo, BindingResult result) { // ... your cutom logic and processing validator.validate(foo, bindingResult); customValidator.validate(foo, bindingResult); if (result.hasErrors()) { // ... on any validation errors } return "view"; } 

に対して明示的に呼び出しますこの記事をチェックし、適切な例があると思うhttp://stackoverflow.com/questions/19190592/manually-call-spring-annotation-validation – Stan

+0

私はこれを以前に見つけたことを覚えています。 SmartValidatorを注入しようとすると、依存関係が見つからなかった適格なBeanが見つかりませんでした[org.springframework.validation.SmartValidator]:autowire候補と見なされる少なくとも1つのbeanが必要です。 SpringのValidatorをインジェクトしようとすると、カスタムバリデーターを含めてBeanが多すぎるために失敗します。 – Arthur

+0

OK、 '@Autowired @Qualifier(" mvcValidator ")を使って注入することができましたバリデーターmvcValidator;' – Arthur

答えて

2

これは@Valid注釈なしで検証を行う方法の春の例である:

Foo target = new Foo(); 
DataBinder binder = new DataBinder(target); 
binder.setValidator(new FooValidator()); 

バインド対象オブジェクトへ

binder.bind(propertyValues); 

ターゲットオブジェクト

binder.validate(); 

を検証任意の検証エラーを含むBindingResultを取得します

BindingResult results = binder.getBindingResult(); 
2

遅くなることがあります。しかし、それは他人に助けになるかもしれません。

実際にバリデーターを明示的に呼び出すには、コンテキスト内にLocalValidatorFactoryBeanが必要です。あなたの任意のコンテキストでは、あなたのコントローラで

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
    <property name="validationMessageSource" ref="messageSource"/> 
</bean> 

AutowireのようにBeanをBeanをdecalre可能性があり、あなたがこのシナリオ

関連する問題