第5章 検証
5.1. Smooks のルール リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Smooks では、ルール は、一般的な概念であり、特定のカートリッジに固有のものではありません。
他のコンポーネントから RuleProvider を設定および参照できます。
注記
ルール機能を使用する唯一のカートリッジは検証カートリッジです。
ルールは、ruleBase で一元的に定義されます。1 つの Smooks 設定で多くの ruleBase 定義を参照できます。rulesBase 設定には、名前、ルール
src
、およびルールプロバイダーがあります。
ルールソースの形式は、プロバイダーの実装に完全に依存します。唯一の要件は、個別のルールを参照できるように (1 つのソースのコンテキスト内で)、一意の名前を付けることです。
5.2. Smooks でルールを設定する リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
ruleBase の設定例は次のとおりです。
5.3. rules:ruleBase 設定要素の必須設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- name: これは、このルールを参照するために、他のコンポーネントによって使用されます。
- src: これは、RuleProvider にとって意味のあるファイルまたはその他のものにすることができます。
- provider: これは実際のプロバイダーの実装です。上記の設定では、正規表現を使用する RuleProvider は 1 つですが、複数の ruleBase 要素を指定して、必要な数の RuleProvider を持つことができます。
5.4. ルールプロバイダー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
ルールプロバイダーは
org.milyn.rules.RuleProvider
インターフェイスを実装します。
Smooks は、2 つの RuleProvider 実装をサポートするように、事前設定されています。
- RegexProvider
- MVELProvider
独自の RuleProvider 実装を作成することもできます。
5.5. RegexProvider リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
RegexProvider は正規表現を利用します。フィルタリングされるメッセージで選択されたデータフィールドの形式に固有の低レベルルールを定義できます。たとえば、正しい電子メールアドレスが使用されていることを確認するために、特定のフィールドに適用して、構文を検証できます。
5.6. Regex ruleBase の設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- このコード例を使用して、Regex ruleBase を設定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 標準の
.properties
ファイル形式で Regex 表現を定義します。次のcustomer.properties
Regex ルール定義ファイルの例は、その方法を示しています。Customer data rules...
# Customer data rules... customerId=[A-Z][0-9]{5} customerName=[A-Z][a-z]*, [A-Z][a-z]
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.7. MVEL プロバイダー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
MVEL プロバイダーを使用すると、ルールを MVEL 式として定義できます。これらの式は、Smooks Javabean コンテキストのコンテンツに実行されます。Smooks Bean コンテキスト内の Java オブジェクトにフィルタリングされているメッセージからバインドデータを取得する必要があります。
MVEL を使用すると、メッセージフラグメントにより複雑なルールを定義できます。(「対象の注文品目フラグメントの製品は注文ヘッダーの詳細で指定された顧客の年齢制限の範囲内ですか?」など)
5.8. MVEL ruleBase の設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- MVEL ruleBase を設定するには、以下のコードを参照してください。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - MVEL ルールを CSV ファイルに保存する必要があります。これらのファイルを編集する最も簡単な方法は、LibreOffice Calc や Gnumeric などのスプレッドシートアプリケーションを使用することです。各ルールレコードには、ルール名と MVEL 式が含まれています。
- コメント行とヘッダー行を作成する場合は、最初のフィールドの前にハッシュ (#) 文字を付けます。
5.9. Smooks 検証カートリッジ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Smooks 検証カートリッジは、ルールカートリッジと連携して、ルールベースのフラグメント検証 を提供します。
これにより、メッセージフラグメントに詳細な検証を実行できます。Smooks のすべてと同様、検証機能はサポートされているすべてのデータ形式で利用できます。つまり、XML データだけでなく、EDI、JSON、CSV などにも強力な検証を行うことができます。
検証設定は、http://www.milyn.org/xsd/smooks/validation-1.0.xsd 設定 namespace で定義されます。
Smooks は多くの異なる ルールプロバイダー タイプをサポートしており、これらは、すべて検証カートリッジで使用できます。これらは、それぞれ異なるレベルの検証を提供しますが、すべてまったく同じ方法で設定されます。Smooks Validation Cartridge は、ルールプロバイダーを抽象リソースと見なし、メッセージフラグメントを検証するために対象とすることができます。
5.10. 検証ルールの設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
検証ルールを設定するには、次を指定する必要があります。
- executeOn: これは、ルールが実行されるフラグメントです。
- executeOnNS: これは、
executeOn
が属するフラグメントの namespace です。 - name: これは、適用されるルールの名前です。これは、ルールベースとルール名の組み合わせをドット区切り形式 (つまり、
ruleBaseName.ruleName
) で参照する複合ルール名です。 - onFail: これは、失敗した一致の重大度を決定します。
検証ルールの設定例は次のとおりです。
<validation:rule executeOn="order/header/email" name="regexAddressing.email" onFail="ERROR" />
<validation:rule executeOn="order/header/email" name="regexAddressing.email" onFail="ERROR" />
5.11. 検証例外の設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- Smooks フィルター操作ごとの検証失敗の最大数を設定できます。(この最大値を超えると、例外が出力されます。) OnFail.FATAL で設定された検証は、常に例外を出力し、処理を停止します。検証失敗の最大数を設定するには、次のコードを Smooks 設定に追加します。
<params> <param name="validation.maxFails">5</param> </params>
<params> <param name="validation.maxFails">5</param> </params>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 検証設定の onFail 属性は、実行するアクションを指定します。これは、検証の失敗を報告する方法を決定します。これを利用するには、必要に応じて、次のオプションを変更します。
- OK: これを使用して、検証を OK として保存します。
ValidationResults.getOks
を呼び出すと、すべての検証警告が返されます。このオプションはコンテンツベースのルーティングに役立ちます。 - WARN: これを使用して、検証を警告として保存します。
ValidationResults.getWarnings
を呼び出すと、すべての検証警告が返されます。 - ERROR: これを使用して、検証をエラーとして保存します。
ValidationResults.getErrors
を呼び出すと、すべての検証エラーが返されます。 - FATAL: これを使用して、検証の失敗が発生するとすぐに、ValidationException を出力します。
ValidationResults.getFatal
を呼び出すと、致命的な検証の失敗が表示されます。
5.12. ルールベース リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- ルールベースには、次の形式の複合ルール名を使用します。
<ruleProviderName>.<ruleName>
<ruleProviderName>.<ruleName>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - ruleProviderName は、ルールプロバイダーを識別し、
ruleBase
要素のname
属性にマッピングします。 - ruleName は、ルールプロバイダーが認識している特定のルールを識別します。これは、
src
ファイルに定義されたルールである可能性があります。
5.13. Smooks.filterSource リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Smooks.filterSource は検証結果を取得します。filterSource メソッドが戻ると、ValidationResult インスタンスにすべての検証データが含まれます。
このコードは、Smooks にメッセージフラグメントの検証を実行させる方法を示しています。
ご覧のとおり、個別の警告とエラーの検証結果は、
ValidationResult
オブジェクトから OnFailResult
インスタンスの形式で取得できます。各インスタンスは、個別の失敗に関する詳細を提供します。
検証カートリッジを使用すると、検証の失敗に関連するローカライズされたメッセージを指定することもできます。これらのメッセージは、標準の Java ResourceBundle ファイル (
.properties
形式を使用) で定義できます。
注記
検証メッセージバンドルのベース名は、ルールソースファイル拡張子を削除し、
i18n
という名前のフォルダーを追加すると、ルールソース ("src") から派生します。たとえば、/org/milyn/validation/order/rules/order-rules.csv
の MVEL ruleBase ソースがある場合、対応する検証メッセージバンドルのベース名は、/org/milyn/validation/order/rules/i18n/order-rules
になります。
5.14. 検証カートリッジとメッセージ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
検証カートリッジを使用すると、ローカライズされたメッセージに FreeMarker テンプレートを適用して、メッセージに Bean コンテキストからのコンテキストデータ、および実際のルールの失敗に関するデータを含めることができます。FreeMarker ベースのメッセージの前に、
ftl:
を付け、標準の FreeMarker 表記を使用して、コンテキストデータを参照する必要があります。Bean コンテキストからの Bean は直接参照できますが、ruleResult
および path
Bean によって RuleEvalResult およびルール失敗パスを参照できます。
Smooks を使用して、メッセージフラグメントデータの検証を実行する方法を示す RegexProvider ルールを使用する例は次のとおりです。
customerId=ftl:Invalid customer number '${ruleResult.text}' at '${path}'. Customer number must match pattern '${ruleResult.pattern}'.
customerId=ftl:Invalid customer number '${ruleResult.text}' at '${path}'. Customer number must match pattern '${ruleResult.pattern}'.
5.15. 検証の種類 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Smooks は、2 種類の検証ルールを使用して、2 種類の検証を実行します。
.properties
ファイル RuleBase に定義された正規表現を使用したメッセージフィールド値/形式の検証。これは、フィールドが有効な電子メールアドレスであることを検証する場合などに使用できます。.csv
ファイル RuleBase に定義された MVEL 式を使用したビジネスルールの検証。これは、たとえば、注文の注文品目の合計価格 (価格 * 数量) が事前定義されたビジネスルールに違反していないことを検証できます。
5.16. 検証ルールの実行 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- 検証ルールを実行するには、例のルートフォルダーに移動し、次を実行します。
- mvn clean install
- mvn exec:java
5.17. RuleBase の例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
この例では、注文品目のコレクションを含む XML メッセージがあります。(この機能は、Smooks がサポートする他のすべてのデータ形式でも同様に機能します。):
5.18. メッセージデータの検証 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- 注文メッセージを処理する際は、多くの検証を行う必要があります。まず、指定されたユーザー名が大文字の後に 5 桁の数字が続く形式 (たとえば、
S12345
またはG54321
) に従っていることを確認します。この検証を実行するには、正規表現を使用する必要があります。 - 次に、提供された電子メールアドレスが有効な形式であることを確認します。正規表現を使用して、確認します。
- 各注文品目の productId フィールドが正確に 3 桁の形式 (
123
など) に従っていることを確認します。これを行うには、正規表現を使用します。 - 最後に、注文品目ごとの合計が 50.00 を超えていないことを確認する必要があります (価格 * 数量は 50.00 を超えていません)。MVEL 式を使用して、この検証を実行します。
5.19. MVEL 式の使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- ルールセットで MVEL 式を使用するには、Regex ルールを分割し、2 つの個別の
.properties
ファイルに配置します。 - これらのルールを
rules
サンプルディレクトリーにドロップします。 - MVEL 式を
rules
ディレクトリー内の.csv
ファイルに配置します。customer.properties
ファイルに含まれる顧客関連の Regex ルールは次のようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 製品関連の Regex ルールを
product.properties
ファイルに挿入します。Product data rules...
# Product data rules... productId=[0-9]{3}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow order-rules.csv
ファイルに、注文品目の合計チェックを実行するための MVEL 式を挿入します。注記.csv ファイルを編集する最も簡単な方法は、LibeOffice Calc や Gnumeric などのスプレッドシートアプリケーションを使用することです。- ルールソースファイルごとにリソースバンドルの
.properties
ファイルを作成します。注記これらのファイルの名前は、対応するルールファイルの名前から派生しています。rules/customer.properties
に定義されたルールのメッセージバンドルは、rules/i18n/customer.properties
ファイルにあります。customerId=ftl:Invalid customer number '${ruleResult.text}' at '${path}'. <!-- Customer number must begin with an uppercase character, followed by 5 digits. --> email=ftl:Invalid email address '${ruleResult.text}' at '${path}'. <!-- Email addresses match pattern '${ruleResult.pattern}'. -->
customerId=ftl:Invalid customer number '${ruleResult.text}' at '${path}'. <!-- Customer number must begin with an uppercase character, followed by 5 digits. --> email=ftl:Invalid email address '${ruleResult.text}' at '${path}'. <!-- Email addresses match pattern '${ruleResult.pattern}'. -->
Copy to Clipboard Copied! Toggle word wrap Toggle overflow rules/product.properties
に定義されたルールのメッセージバンドルは、rules/i18n/product.properties
ファイルにあります。Product data rule messages...
# Product data rule messages... productId=ftl:Invalid product ID '${ruleResult.text}' at '${path}'. <!-- Product ID must match pattern '${ruleResult.pattern}'. -->
Copy to Clipboard Copied! Toggle word wrap Toggle overflow rules/order-rules.csv
に定義されたルールのメッセージバンドルは、rules/i18n/order-rules.properties
ファイルにあります。<!-- Order item rule messages. The "orderDetails" and "orderItem" beans are populated by Smooks bindings - see config in following section. -->
# <!-- Order item rule messages. The "orderDetails" and "orderItem" beans are populated by Smooks bindings - see config in following section. --> order_item_total=ftl:Order ${orderDetails.orderId} <!-- contains an order item for product ${orderItem.productId} with a quantity of ${orderItem.quantity} and a unit price of ${orderItem.price}. This exceeds the permitted per order item total. -->
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - この検証をルールに適用します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のコードを使用して、例の
Main
クラスから実行します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow