第5章 検証


5.1. Smooks のルール

Smooks では、ルール は、一般的な概念であり、特定のカートリッジに固有のものではありません。
他のコンポーネントから RuleProvider を設定および参照できます。
注記
ルール機能を使用する唯一のカートリッジは検証カートリッジです。
ルールは、ruleBase で一元的に定義されます。1 つの Smooks 設定で多くの ruleBase 定義を参照できます。rulesBase 設定には、名前、ルール src、およびルールプロバイダーがあります。
ルールソースの形式は、プロバイダーの実装に完全に依存します。唯一の要件は、個別のルールを参照できるように (1 つのソースのコンテキスト内で)、一意の名前を付けることです。

5.2. Smooks でルールを設定する

ruleBase の設定例は次のとおりです。
<?xml version="1.0"?>
<smooks-resource-list  xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"  xmlns:rules="http://www.milyn.org/xsd/smooks/rules-1.0.xsd">
 
    <rules:ruleBases>
        <rules:ruleBase name="regexAddressing" src="/org/milyn/validation/address.properties" provider="org.milyn.rules.regex.RegexProvider" />
        <rules:ruleBase name="order" src="/org/milyn/validation/order/rules/order-rules.csv" provider="org.milyn.rules.mvel.MVELProvider"/>
    </rules:ruleBases>
 
</smooks-resource-list>
Copy to Clipboard Toggle word wrap

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 の設定

  1. このコード例を使用して、Regex ruleBase を設定します。
    <?xml version="1.0"?>
    <smooks-resource-list  xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"  xmlns:rules="http://www.milyn.org/xsd/smooks/rules-1.0.xsd">
     
        <rules:ruleBases>
            <rules:ruleBase name="customer" src="/org/milyn/validation/order/rules/customer.properties" provider="org.milyn.rules.regex.RegexProvider"/>
        </rules:ruleBases>
     
    </smooks-resource-list>
    
    Copy to Clipboard Toggle word wrap
  2. 標準の .properties ファイル形式で Regex 表現を定義します。次の customer.properties Regex ルール定義ファイルの例は、その方法を示しています。
    # Customer data rules...
    customerId=[A-Z][0-9]{5}
    customerName=[A-Z][a-z]*, [A-Z][a-z]
    
    Copy to Clipboard Toggle word wrap

5.7. MVEL プロバイダー

MVEL プロバイダーを使用すると、ルールを MVEL 式として定義できます。これらの式は、Smooks Javabean コンテキストのコンテンツに実行されます。Smooks Bean コンテキスト内の Java オブジェクトにフィルタリングされているメッセージからバインドデータを取得する必要があります。
MVEL を使用すると、メッセージフラグメントにより複雑なルールを定義できます。(「対象の注文品目フラグメントの製品は注文ヘッダーの詳細で指定された顧客の年齢制限の範囲内ですか?」など)

5.8. MVEL ruleBase の設定

  1. MVEL ruleBase を設定するには、以下のコードを参照してください。
    <?xml version="1.0"?>
    <smooks-resource-list  xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"  xmlns:rules="http://www.milyn.org/xsd/smooks/rules-1.0.xsd">
     
        <rules:ruleBases>
            <rules:ruleBase name="order" src="/org/milyn/validation/order/rules/order-rules.csv" provider="org.milyn.rules.mvel.MVELProvider"/>
        </rules:ruleBases>
     
    </smooks-resource-list>
    
    Copy to Clipboard Toggle word wrap
  2. MVEL ルールを CSV ファイルに保存する必要があります。これらのファイルを編集する最も簡単な方法は、LibreOffice CalcGnumeric などのスプレッドシートアプリケーションを使用することです。各ルールレコードには、ルール名と MVEL 式が含まれています。
  3. コメント行とヘッダー行を作成する場合は、最初のフィールドの前にハッシュ (#) 文字を付けます。

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" />
Copy to Clipboard Toggle word wrap

5.11. 検証例外の設定

  1. Smooks フィルター操作ごとの検証失敗の最大数を設定できます。(この最大値を超えると、例外が出力されます。) OnFail.FATAL で設定された検証は、常に例外を出力し、処理を停止します。
    検証失敗の最大数を設定するには、次のコードを Smooks 設定に追加します。
    <params>
        <param name="validation.maxFails">5</param>
    </params>
    
    Copy to Clipboard Toggle word wrap
  2. 検証設定の onFail 属性は、実行するアクションを指定します。これは、検証の失敗を報告する方法を決定します。これを利用するには、必要に応じて、次のオプションを変更します。
    • OK: これを使用して、検証を OK として保存します。ValidationResults.getOks を呼び出すと、すべての検証警告が返されます。このオプションはコンテンツベースのルーティングに役立ちます。
    • WARN: これを使用して、検証を警告として保存します。ValidationResults.getWarnings を呼び出すと、すべての検証警告が返されます。
    • ERROR: これを使用して、検証をエラーとして保存します。ValidationResults.getErrors を呼び出すと、すべての検証エラーが返されます。
    • FATAL: これを使用して、検証の失敗が発生するとすぐに、ValidationException を出力します。ValidationResults.getFatal を呼び出すと、致命的な検証の失敗が表示されます。

5.12. ルールベース

  • ルールベースには、次の形式の複合ルール名を使用します。
    <ruleProviderName>.<ruleName>
    
    Copy to Clipboard Toggle word wrap
    • ruleProviderName は、ルールプロバイダーを識別し、ruleBase 要素の name 属性にマッピングします。
    • ruleName は、ルールプロバイダーが認識している特定のルールを識別します。これは、src ファイルに定義されたルールである可能性があります。

5.13. Smooks.filterSource

Smooks.filterSource は検証結果を取得します。filterSource メソッドが戻ると、ValidationResult インスタンスにすべての検証データが含まれます。
このコードは、Smooks にメッセージフラグメントの検証を実行させる方法を示しています。
ValidationResult validationResult = new ValidationResult();
 
smooks.filterSource(new StreamSource(messageInStream), new StreamResult(messageOutStream), validationResult);
 
List<OnFailResult> errors = validationResult.getErrors();
List<OnFailResult> warnings = validationResult.getWarnings();
Copy to Clipboard Toggle word wrap
ご覧のとおり、個別の警告とエラーの検証結果は、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}'.
Copy to Clipboard Toggle word wrap

5.15. 検証の種類

Smooks は、2 種類の検証ルールを使用して、2 種類の検証を実行します。
  • .properties ファイル RuleBase に定義された正規表現を使用したメッセージフィールド値/形式の検証。これは、フィールドが有効な電子メールアドレスであることを検証する場合などに使用できます。
  • .csv ファイル RuleBase に定義された MVEL 式を使用したビジネスルールの検証。これは、たとえば、注文の注文品目の合計価格 (価格 * 数量) が事前定義されたビジネスルールに違反していないことを検証できます。

5.16. 検証ルールの実行

  • 検証ルールを実行するには、例のルートフォルダーに移動し、次を実行します。
    1. mvn clean install
    2. mvn exec:java

5.17. RuleBase の例

この例では、注文品目のコレクションを含む XML メッセージがあります。(この機能は、Smooks がサポートする他のすべてのデータ形式でも同様に機能します。):
<Order>
	<header>
        <orderId>A188127</orderId>
        <username>user1</username>
        <name>
            <firstname>Bob</firstname>
            <lastname>Bobington</lastname>
        </name>
        <email>bb@awesomemail.com</email>
        <state>Queensland</state>
    </header>
    <order-item>
        <quantity>1</quantity>
        <productId>364b</productId>
        <title>A Great Movie</title>
        <price>29.95</price>
    </order-item>
    <order-item>
        <quantity>2</quantity>
        <productId>299</productId>
        <title>A Terrible Movie</title>
        <price>29.95</price>
    </order-item>
</Order>
Copy to Clipboard Toggle word wrap

5.18. メッセージデータの検証

  1. 注文メッセージを処理する際は、多くの検証を行う必要があります。まず、指定されたユーザー名が大文字の後に 5 桁の数字が続く形式 (たとえば、S12345 または G54321) に従っていることを確認します。この検証を実行するには、正規表現を使用する必要があります。
  2. 次に、提供された電子メールアドレスが有効な形式であることを確認します。正規表現を使用して、確認します。
  3. 各注文品目の productId フィールドが正確に 3 桁の形式 (123 など) に従っていることを確認します。これを行うには、正規表現を使用します。
  4. 最後に、注文品目ごとの合計が 50.00 を超えていないことを確認する必要があります (価格 * 数量は 50.00 を超えていません)。MVEL 式を使用して、この検証を実行します。

5.19. MVEL 式の使用

  1. ルールセットで MVEL 式を使用するには、Regex ルールを分割し、2 つの個別の .properties ファイルに配置します。
  2. これらのルールを rules サンプルディレクトリーにドロップします。
  3. MVEL 式を rules ディレクトリー内の .csv ファイルに配置します。
    customer.properties ファイルに含まれる顧客関連の Regex ルールは次のようになります。
    # Customer data rules...
    customerId=[A-Z][0-9]{5}
     
    # Email address...
    email=^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$
    
    Copy to Clipboard Toggle word wrap
  4. 製品関連の Regex ルールを product.properties ファイルに挿入します。
    # Product data rules...
    productId=[0-9]{3}
    
    Copy to Clipboard Toggle word wrap
  5. order-rules.csv ファイルに、注文品目の合計チェックを実行するための MVEL 式を挿入します。
    注記
    .csv ファイルを編集する最も簡単な方法は、LibeOffice CalcGnumeric などのスプレッドシートアプリケーションを使用することです。
  6. ルールソースファイルごとにリソースバンドルの .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}'. -->
    
    Copy to Clipboard Toggle word wrap
    rules/product.properties に定義されたルールのメッセージバンドルは、rules/i18n/product.properties ファイルにあります。
    # Product data rule messages...
    productId=ftl:Invalid product ID '${ruleResult.text}' at '${path}'. 
    <!--  Product ID must match pattern '${ruleResult.pattern}'. -->
    
    Copy to Clipboard Toggle word wrap
    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_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 Toggle word wrap
  7. この検証をルールに適用します。
    <?xml version="1.0"?>
    <smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"
                          xmlns:rules="http://www.milyn.org/xsd/smooks/rules-1.0.xsd"
                          xmlns:validation="http://www.milyn.org/xsd/smooks/validation-1.0.xsd"
                          xmlns:jb="http://www.milyn.org/xsd/smooks/javabean-1.2.xsd">
     
        <params>
            <!-- Generate a ValidationException if we get more than 5 validation failures... -->
            <param name="validation.maxFails">5</param>
        </params>
     
        <!-- Define the ruleBases that are used by the validation rules... -->
        <rules:ruleBases>
            <!-- Field value rules using regex... -->
            <rules:ruleBase name="customer" src="rules/customer.properties" provider="org.milyn.rules.regex.RegexProvider"/>
            <rules:ruleBase name="product" src="rules/product.properties" provider="org.milyn.rules.regex.RegexProvider"/>
     
            <!-- Order business rules using MVEL expressions... -->
            <rules:ruleBase name="order" src="rules/order-rules.csv" provider="org.milyn.rules.mvel.MVELProvider"/>
        </rules:ruleBases>
     
        <!-- Capture some data into the bean context - required by the business rule validations... -->
        <jb:bean beanId="orderDetails" class="java.util.HashMap" createOnElement="header">
            <jb:value data="header/*"/>
        </jb:bean>
        <jb:bean beanId="orderItem" class="java.util.HashMap" createOnElement="order-item">
            <jb:value data="order-item/*"/>
        </jb:bean>
     
        <!-- Target validation rules... -->
        <validation:rule executeOn="header/username" name="customer.customerId" onFail="ERROR"/>
        <validation:rule executeOn="email" name="customer.email" onFail="WARN"/>
        <validation:rule executeOn="order-item/productId" name="product.productId" onFail="ERROR"/>
     
        <validation:rule executeOn="order-item" name="order.order_item_total" onFail="ERROR"/>
     
    </smooks-resource-list>
    
    Copy to Clipboard Toggle word wrap
  8. 次のコードを使用して、例の Main クラスから実行します。
    protected static ValidationResult runSmooks(final String messageIn) throws IOException, SAXException, SmooksException {
        // Instantiate Smooks with the config...
        final Smooks smooks = new Smooks("smooks-config.xml");
     
        try {
            // Create an exec context - no profiles....
            final ExecutionContext executionContext = smooks.createExecutionContext();
            final ValidationResult validationResult = new ValidationResult();
     
            // Configure the execution context to generate a report...
            executionContext.setEventListener(new HtmlReportGenerator("target/report/report.html"));
     
            // Filter the input message...
            smooks.filterSource(executionContext, new StringSource(messageIn), validationResult);
     
            return validationResult;
        }
        finally {
            smooks.close();
        }
    }
    
    Copy to Clipboard Toggle word wrap

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat