次の例では、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();
}
検証のためです。
検証ユーザー入力をモデルにバインドした後、モデルを検証するのが一般的です。 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/
上記の回答に加えて、以下をご覧ください。 AppointmentForm
のdate
列には、いくつかの注釈が付けられています。 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;
}
IIRC @Validは、Springアノテーションではなく、JSR-303アノテーション(Bean Validation標準)です。基本的に、メソッドに送信するデータが有効かどうかを確認します(scriptFileを検証します)。
@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には適用されません)。
public String create(@Valid @NotNull ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {
if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");
条件が必要ない場合、この@NotNull
注釈が有効であると思います。
上記の答えに追加するだけで、Webアプリケーションでは@valid
が使用され、検証されるBeanにも検証アノテーションが付けられます。 @NotNull
、@Email
(hibernateアノテーション)。ユーザーから入力を取得しているときに値を検証でき、バインド結果に検証結果が含まれる場合。 bindingResult.hasErrors()
は、検証に失敗したかどうかを示します。
上記以外の@Validのもう1つの便利な側面は、(つまり、Postmanを使用してエンドポイントをテストする)@Validは、ほとんど読みにくいテキストのblobではなく、誤ったREST呼び出しの出力をフォーマットされたJSONにフォーマットすることです。これは、ユーザー向けに商業的に消費可能なAPIを作成する場合に非常に便利です。