2017-10-02 14 views
2

私はフォームを検証するためにスプリングを使用しています。フォームのモデルは次のようになります。複数の制約のスプリング検証

public class FormModel { 

    @NotBlank 
    private String name; 

    @NotNull 
    @ImageSizeConstraint 
    private MultipartFile image; 

} 

'@ImageSizeConstraint'はカスタム制約です。私が欲しいのは、最初に@NotNullを評価し、これがfalseに評価された場合、@ImageSizeConstraintを評価しないことです。

これができない場合は、カスタム制約でもnullをチェックする必要があります。これは問題ではありませんが、問題(null/image size/image/aspectratio /などではない)を分けていきたいと思います。

+0

カスタム制約の 'NotNull' **をコーディングするとどうでしょうか? –

+0

可能ですが、懸念事項を分けたいと思います。 –

答えて

1

制約のグループ化とグループの順序を使用して検証順序を定義することができます。 JSR-303(一部3.5検証ルーチン)によれば:グループ配列によって順序付けられていない限り

、グループがない 特定の順序で検証することができます。これは、同一パス内の複数のグループについて、検証ルーチンを で実行できることを意味します。

Hibernateバリdocumentationが言うように:

あなただけ インターフェイスを定義し、@GroupSequenceでそれに注釈を付ける必要があり、このような検証順序を実現するためには、グループが持っているため を定義します検証する(グループの定義 シーケンスを参照)。シーケンスされたグループで少なくとも1つの制約が失敗した場合、シーケンス内の次のグループの制約のうち には が有効になりません。その後、

public interface CheckItFirst {} 

public interface ThenCheckIt {} 

public class FormModel { 

    @NotBlank 
    private String name; 

    @NotNull(groups = CheckItFirst.class) 
    @ImageSizeConstraint(groups = ThenCheckIt.class) 
    private MultipartFile image; 
} 

そして、制約は関係なく、彼らは(Defaultグループに属しているグループの、順不同で評価されているとおり

まず、あなたは制約グループを定義し、制約にそれらを適用する必要があまりにも)、imageフィールド制約グループのために@GroupSequenceを作成する必要があります。

@GroupSequence({ CheckItFirst.class, ThenCheckIt.class }) 
public interface OrderedChecks {} 

あなたはメソッド・レベルの検証のための検証グループを指定することができ、@Validatedアノテーションを使用して、Spring MVCのコントローラの方法でこの検証を適用するには

Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); 
Set<ConstraintViolation<FormModel>> constraintViolations = 
          validator.validate(formModel, OrderedChecks.class); 

でそれをテストすることができます。

@PostMapping(value = "/processFormModel") 
public String processFormModel(@Validated(OrderedChecks.class) FormModel formModel) { 
    <...> 
} 
+0

おそらく、Spring MVCのためにコントローラーは@Validated({CheckItFirst.class、ThenCheckIt.class})を使用してこれを使用する必要があります。 –

+1

Spring MVCコントローラの例が追加されました。 Hibernateバリデーターは検証ルーチンで@Validated引数の順序を維持しているようですが、JSR-303は検証順序を定義する唯一の方法だと述べているので、シーケンスを使用するべきです。 –

関連する問題