web-dev-qa-db-ja.com

Springで@Validアノテーションは何を示していますか?

次の例では、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();        
}    
67
Gary Ford

検証のためです。

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


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

54
mhshams

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

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

    static class AppointmentForm {

        @NotNull @Future
        private Date date;
    }
26
Charith

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

14
Mateusz Dymczyk

@Valid自体は、Springとは関係ありません。 Bean Validation仕様の一部です(いくつかありますが、最新のものは2017年後半のJSR 380です)@Validは非常に古く、JSR 303から派生しています。

ご存知のように、Springはすべての異なるJSRおよびJavaライブラリ一般との統合を提供するのに非常に優れており(JPA、JTA、キャッシングなどを考えてください)、もちろんそれらの人も検証を行いました。これを容易にする重要なコンポーネントの1つは、 MethodValidationPostProcessor です。

質問に答えようとする-@Validは、オブジェクトの最上位要素だけでなく、複雑なグラフを検証する場合に、いわゆる検証カスケードに非常に便利です。さらに深くしたいときは、@Validを使用する必要があります。それがJSRの指示です。 Springはこれに若干の逸脱を伴います(たとえば、RestControllerメソッドに@Validatedの代わりに@Validを配置してみましたが、検証は機能しますが、通常の「サービス」Beanには適用されません)。

12
yuranos87
public String create(@Valid @NotNull ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {    
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");        

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

2
mzlobecki

上記の答えに追加するだけで、Webアプリケーションでは@validが使用され、検証されるBeanにも検証アノテーションが付けられます。 @NotNull@Email(hibernateアノテーション)。ユーザーから入力を取得しているときに値を検証でき、バインド結果に検証結果が含まれる場合。 bindingResult.hasErrors()は、検証に失敗したかどうかを示します。

1
puneet goyal

上記以外の@Validのもう1つの便利な側面は、(つまり、Postmanを使用してエンドポイントをテストする)@Validは、ほとんど読みにくいテキストのblobではなく、誤ったREST呼び出しの出力をフォーマットされたJSONにフォーマットすることです。これは、ユーザー向けに商業的に消費可能なAPIを作成する場合に非常に便利です。

0
Sean Gildea