ユーザ入力のチェック

Objective

After completing this lesson, you will be able to アノテーションを使用したユーザ入力のチェック

アノテーション

CAP では、サーバ側入力チェックがサポートされています。これはアノテーションによって制御され、その一部が以下に示されています。ここで説明した内容を超える情報については、CAP 文書を参照してください

この学習では、以下の注釈について説明します。

  • @mandatory
  • @assert.target
  • @assert.range

@必須

最初に、アノテーション @mandatory を使用します。@mandatory とマークされた要素が空でない入力がないかチェックされます。null および (トリムされた) 空の文字列は拒否されます。

この例では、Books エンティティの title エレメントにアノテーション @mandatory が付いています。タイトルなしでブックを作成しようとすると、対応する要求により HTTP ステータスコード 400 (Bad Request) の応答が返されます。応答には、以下のようなエラーメッセージが含まれます。

JSON
123456
"error": { "code": "400", "message": "Value is required", "target": "title", "@Common.numericSeverity": 4 }

注記

SQL の場合と同様に、特定の要素に対して値が指定されていない場合、INSERT 時に入力するデフォルト値を指定できます。このために、キーワード default を使用することができます。前の例では、新しいブックの作成時にこの要素に値が指定されていない場合、Books エンティティの stock 要素に対して値 0 が設定されます。

@assert.target

@assert.target アノテーションは、CDS モデルエンティティの管理対象 1 対 1 アソシエーションに使用できます。このアノテーションは、CREATE および UPDATE 操作中に、アソシエーションが参照するターゲットエンティティが存在するかどうかをチェックするために使用されます。つまり、このアノテーションを使用して、テーブル内の非 Null 外部キーに、関連付けられた/参照されるターゲットテーブルに対応する 1 次キーがあることを確認します。

この例では、Books エンティティの管理対象 1 アソシエーション作成者は@mandatory および @assert.target のアノテーションが付けられています。@mandatory アノテーションにより、ブック作成者が指定されます。@assert.target アノテーションでは、指定された作成者が存在するかどうかもチェックされます。

新しいブックを作成しようとして、要求で指定された作成者 ID がデータベースに存在しない場合、要求された CREATE 操作は実行されません。代わりに、HTTP 応答のステータスコードは 400 (Bad Request) です。これは、アノテーション @mandatory ですでに確認されているためです。応答本文には、以下のようなエラーメッセージが含まれます。無効な外部キーを指し示しています。

JSON
123456
"error": { "code": "400", "message": "Value doesn't exist", "target": "author_ID", "@Common.numericSeverity": 4 }

@assert.range

@assert.range アノテーションでは、序数タイプのモデルエンティティのエレメント (数値または日付/時刻タイプ) の値範囲を指定することができます。値範囲は、以下の構文の間隔として定義されます。

Code Snippet
1
@assert.range: [min, max]

定義された範囲は閉じた間隔と見なされます。つまり、指定した値が最小以上かつ最大以下であるかどうかがチェックされます。

enum エレメントの場合、true を指定すると、定義された列挙値に入力可能な値を制限することができます。

この例では、Books エンティティのジャンルエレメントのデータ型は Genre であり、これは列挙値を含むカスタム型です。genle エレメントに @assert.range: true というアノテーションを付けると、このエレメントに対して列挙からの値 (1 または 2) のみを指定できるようになります。

たとえば、書籍の登録時にジャンルエレメントに値 3 が指定されている場合、要求された CREATE 操作は実行されません。代わりに、HTTP 応答のステータスコードは 400 (Bad Request) であり、応答本文には以下のようなエラーメッセージが含まれます。

Code Snippet
123456
"error": { "code": "400", "message": "Value 3 is invalid according to enum declaration {1, 2}", "target": "genre", "@Common.numericSeverity": 4 }

デモおよび演習:入力チェックの実装

注記

演習問題として、SAP Business Application Studio で、以下のデモのステップバイステップの手順を実行します。

演習の開始点として、前の演習問題 "ローカライズされたデータ、コード一覧、および共通の再利用タイプの使用" の結果を使用します (正常に完了している場合)。または、以下の GitHub リポジトリのブランチ 7_localized_data を開始点として使用することもできます。

https://github.com/SAP-samples/cap-development-learning-journey

シミュレーションの完全な実装は、GitHub リポジトリの 8_input_validation ブランチにあります。

リポジトリのコンテンツとその使用方法の詳細については、ここを参照してください。

入力チェックの実装方法については、ビデオを視聴してください。