私はあなたの質問がどこに向かっているのか知っていると思います。そして、この質問は Google の検索のメイン結果に表示される質問なので、@Valid アノテーションが何をするのかについて簡単な答えを出すことができます。
@Valid をどのように使用したかについて、3 つのシナリオを紹介します。
モデル:
public class Employee{
private String name;
@NotNull(message="cannot be null")
@Size(min=1, message="cannot be blank")
private String lastName;
//Getters and Setters for both fields.
//...
}
JSP:
...
<form:form action="processForm" modelAttribute="employee">
<form:input type="text" path="name"/>
<br>
<form:input type="text" path="lastName"/>
<form:errors path="lastName"/>
<input type="submit" value="Submit"/>
</form:form>
...
シナリオ 1 のコントローラー:
@RequestMapping("processForm")
public String processFormData(@Valid @ModelAttribute("employee") Employee employee){
return "employee-confirmation-page";
}
このシナリオでは、空の lastName フィールドでフォームを送信した後、検証ルールを適用しているが、それをまったく処理していないため、エラー ページが表示されます。
上記エラーの例:
例外ページ
シナリオ 2 のコントローラー:
@RequestMapping("processForm")
public String processFormData(@Valid @ModelAttribute("employee") Employee employee,
BindingResult bindingResult){
return bindingResult.hasErrors() ? "employee-form" : "employee-confirmation-page";
}
このシナリオでは、その検証からのすべての結果を bindingResult に渡しているため、そのフォームの検証結果をどうするかはユーザー次第です。
シナリオ 3 のコントローラー:
@RequestMapping("processForm")
public String processFormData(@Valid @ModelAttribute("employee") Employee employee){
return "employee-confirmation-page";
}
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Map<String, String> invalidFormProcessor(MethodArgumentNotValidException ex){
//Your mapping of the errors...etc
}
このシナリオでは、最初のシナリオのようにエラーをまだ処理していませんが、フォーム モデルの処理時に@Validがトリガーする例外を処理する別のメソッドにそれを渡します。これをチェックして、マッピングとそのすべてをどうするかを確認してください。
要約すると: @Valid 単独で、JSR 303 アノテーション付きフィールド ( @NotNull、@Email、@Size など)の検証をトリガーすることは何もないので、何をすべきかの戦略を指定する必要があります。上記の検証の結果とともに。
これでつまずくかもしれない人々のために何かをクリアできたことを願っています.