1

10 個のフィールドを持つフォームがありますが、最初はページに 5 つのフィールドしか表示されません。残りのフィールドは非表示になり、他のフィールドにバインドされた onChange イベント リスナーに基づいて表示されます。

空白ではないフィールドが 5 つだけあるフォームを送信できるシナリオがあります。その場合、検証はそれらの 5 つに対してのみ実行する必要があります。場合によっては、すべてのフィールドに対して検証を実行する必要があります (onChange コールバックを使用した他のフィールドの状態に基づいて)。注釈を使用してフィールド検証をフィルタリングする方法はありますか、それともカスタム バリデータを作成する必要がありますか?

現在、10 個のフォーム フィールドすべてが検証されています。ルールは次のとおりです。

  • a、b、c、d、e は必須フィールドです
  • f,g,h は、a="111" の場合にのみ表示されます
  • i,j は、c="222" の場合にのみ表示されます

サンプルコード:

@NotBlank
private String a;
@NotBlank
private String b;
@NotBlank
private String c;
@NotBlank
private String d;
@NotBlank
private String e;

@NotBlank(a="111")
private String f;
@NotBlank(a="111")
private String g;
@NotBlank(a="111")
private String h;
@NotBlank(c="222")
private String i;
@NotBlank(c="222")
private String j;

コントローラーコード:

@RequestMapping(value="/payments/getTax.do", method=RequestMethod.POST) 
public String getTaxInfo(@Valid OneTimeForm command, BindingResult result, 
    Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {        


OneTimeForm oneTimeForm = (OneTimeForm) command;        

try {
    validator.validate(oneTimeForm, result);
} catch (ValidationException ex) {  
    throw ex;
}
...///
4

4 に答える 4

4

Bean Validation アノテーションを介して必須フィールドを検証できますが、より複雑な条件ロジック (つまりf,g,h show up only if a="111" and i,j show up only if c="222") にはorg.springframework.validation.Validator.

あなたの場合の実装例は次のようになります。

public class OneTimeFormValidator implements org.springframework.validation.Validator {

    @Override
    public boolean supports(Class clazz) {
       return OneTimeForm.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        final OneTimeForm form = (OneTimeForm) target;
        if ("111".equals(form.getA())) {
            ValidationUtils.rejectIfEmptyOrWhitespace(errors, "f", "f.required");
            ValidationUtils.rejectIfEmptyOrWhitespace(errors, "g", "g.required");
            ValidationUtils.rejectIfEmptyOrWhitespace(errors, "h", "h.required");
        }
        if ("222".equals(form.getC())) {
            ValidationUtils.rejectIfEmptyOrWhitespace(errors, "i", "i.required");
            ValidationUtils.rejectIfEmptyOrWhitespace(errors, "j", "j.required");
        }
    }
 }

ValidationUtils.rejectIfEmptyOrWhitespace(Errors, String, String)@NotBlank行動的にも同じです。したがって、オプションのフィールドに注釈を付けないでください。

@NotBlank
private String a;
@NotBlank
private String b;
@NotBlank
private String c;
@NotBlank
private String d;
@NotBlank
private String e;

private String f;
private String g;
private String h;
private String i;
private String j;

コントローラーは次のようになります。

...

@Autowired
private org.springframework.validation.Validator oneTimeFormValidator;

@RequestMapping(value="/payments/getTax.do", method=RequestMethod.POST)  
public String getTaxInfo(@Valid OneTimeForm command, BindingResult result) { 

     // validates conditional logic with OneTimeFormValidator
     oneTimeFormValidator.validate(command, result);

     if (result.hasErrors()) {
         // return a page
     }
     // do something else and return a page
}

...

必須フィールドは、 をjavax.validation.Validator介して提供された型のインスタンスで検証されます@Valid。遭遇した検証エラーはインスタンスに入れられBindingResultます。次に、 を介して条件付き検証が実行OneTimeFormValidatorされ、検出された検証エラーが の同じインスタンスに入れられますBindingResult

于 2016-07-21T09:06:12.573 に答える
2

検証グループを使用し、2 つのグループを定義しますhttps://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#chapter-groups

于 2017-08-08T10:27:25.993 に答える
2

バリデーターを手動で実行し、クライアントに返したくないエラーを除外できるはずです。バリデーターを手動で実行できるようにするには、残りのメソッドの実装の引数として BindingResult を追加する必要がありました。BindingResult がないと、Spring フレームワークはメソッドを呼び出さず、検証エラーをクライアントに返しました。

@RequestMapping(method = PATCH, value = "/{id}")
public ResponseEntity<User> patchUser(@RequestBody User patchUser,
                                      BindingResult bindingResult)  {

コントローラーについて説明していただければ、より正確な回答を提供できます。

詳細をありがとう。私のソリューションでは、コントローラー定義から @Valid アノテーションを削除したため、空の bindingResult があります。次に、プログラムで検証し、クライアントに返したい検証エラーを選択します。

BindingResult allErrors = new BeanPropertyBindingResult(target, objectName);
//validate and copy relevant errors into bindingResult
validator.validate(target, allErrors);
for (FieldError fe : allErrors.getFieldErrors()) {
        if (/* your conditions */) {
            bindingResult.addError(fe);
        }
    }
于 2016-07-19T16:51:09.443 に答える
0

そのための 2 つの方法を提案できます。

小さなモデルを作成し、それに対して検証できます。検証が成功したら、エンティティを構築します。

または、独自の検証制約を作成して、クラス全体を onSubmit で検証することもできます。

于 2016-07-19T23:36:19.547 に答える