105

次の例では、パラメーターが注釈ScriptFileでマークされています。@Valid

注釈は何をし@Validますか?

@RequestMapping(value = "/scriptfile", method = RequestMethod.POST)    
public String create(@Valid ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {    
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");        
    if (result.hasErrors()) {        
        modelMap.addAttribute("scriptFile", scriptFile);            
        modelMap.addAttribute("showcases", ShowCase.findAllShowCases());            
        return "scriptfile/create";            
    }        
    scriptFile.persist();        
    return "redirect:/scriptfile/" + scriptFile.getId();        
}    
4

9 に答える 9

74

検証目的です。

検証 ユーザー入力をモデルにバインドした後、モデルを検証するのが一般的です。Spring 3 は、JSR-303 による宣言型検証のサポートを提供します。このサポートは、Hibernate Validator などの JSR-303 プロバイダーがクラスパスに存在する場合、自動的に有効になります。有効にすると、Controller メソッドのパラメーターに @Valid アノテーションを付けるだけで検証をトリガーできます。受信 POST パラメーターをバインドした後、AppointmentForm が検証されます。この場合、日付フィールドの値が null ではなく、将来発生することを確認します。


詳細については、こちらをご覧ください:
http://blog.springsource.com/2009/11/17/spring-3-type-conversion-and-validation/

于 2010-08-29T14:51:59.060 に答える
42

上記の回答に加えて、以下をご覧ください。AppointmentFormdate列には、いくつかの注釈が付けられています。(この場合はと) で@Valid検証をトリガーするアノテーションを持つことによって。これらの注釈は、さまざまな JSR-303 プロバイダー (Hibernate、Spring など) から取得できます。AppointmentForm@NotNull@Future

    @RequestMapping(value = "/appointments", method = RequestMethod.POST)
    public String add(@Valid AppointmentForm form, BindingResult result) {
        ....
    }

    static class AppointmentForm {

        @NotNull @Future
        private Date date;
    }
于 2015-10-07T00:31:30.167 に答える
19

IIRC @Validは、Springアノテーションではなく、JSR-303アノテーション(Bean Validation標準)です。基本的に、メソッドに送信するデータが有効かどうかをチェックします(scriptFileを検証します)。

于 2010-08-29T14:56:00.550 に答える
3
public String create(@Valid @NotNull ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {    
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");        

@NotNull条件が必要ない場合、この注釈は有効だと思います。

于 2015-11-08T04:50:29.310 に答える
3

私はあなたの質問がどこに向かっているのか知っていると思います。そして、この質問は 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 など)の検証をトリガーすることは何もないので、何をすべきかの戦略を指定する必要があります。上記の検証の結果とともに。

これでつまずくかもしれない人々のために何かをクリアできたことを願っています.

于 2020-10-20T20:51:32.833 に答える
2

上記の回答に追加するだけで、Web アプリケーション @validでは、検証対象の Bean にも検証注釈(休止状態注釈)@NotNullなどの注釈が付けられて@Emailいるため、ユーザーからの入力を取得しているときに値を検証でき、バインディング結果に検証が含まれます。結果。 bindingResult.hasErrors()検証が失敗したかどうかがわかります。

于 2015-06-23T07:00:03.063 に答える