Smooks ユーザーガイド
このガイドは、ESB パイプラインアクションとして Smooks 変換を使用する開発者を対象としています。
5.3.1 エディッション
概要
はじめに リンクのコピーリンクがクリップボードにコピーされました!
第1章 はじめに リンクのコピーリンクがクリップボードにコピーされました!
1.1. ビジネス統合 リンクのコピーリンクがクリップボードにコピーされました!
1.2. サービス指向アーキテクチャーとは リンクのコピーリンクがクリップボードにコピーされました!
はじめに
サービス指向アーキテクチャー (SOA) は、1 つのプログラムまたはテクノロジーではなく、むしろ、ソフトウェア設計パラダイムと考えてください。
1.3. サービス指向アーキテクチャーの重要なポイント リンクのコピーリンクがクリップボードにコピーされました!
- 交換される メッセージ
- サービスリクエスターおよびプロバイダーとして動作する エージェント
- メッセージを送受信できる 共有トランスポートメカニズム
1.4. JBoss Enterprise SOA Platform とは リンクのコピーリンクがクリップボードにコピーされました!
1.5. Service-Oriented Architecture Paradigm リンクのコピーリンクがクリップボードにコピーされました!
- サービスプロバイダー
- サービスプロバイダーはサービスへのアクセスを許可し、サービスの説明を作成し、サービスブローカーに公開します。
- サービスリクエスター
- サービスリクエスターは、サービスブローカーが提供するサービスの説明を検索して、サービスを検出します。リクエスターは、サービスプロバイダーが提供するサービスに対するバインドも行います。
- サービスブローカー
- サービスブローカーは、サービスの記述のレジストリーをホストします。リクエスターをサービスプロバイダーにリンクします。
1.6. コアおよびコンポーネント リンクのコピーリンクがクリップボードにコピーされました!
1.7. JBoss Enterprise SOA Platform のコンポーネント リンクのコピーリンクがクリップボードにコピーされました!
- 完全な Java EE 準拠のアプリケーションサーバー (JBoss Enterprise Application Platform)
- Enterprise Service Bus (JBoss ESB)
- ビジネスプロセス管理システム (jBPM)
- ビジネスルールエンジン (JBoss ルール)
- オプションの JBoss Enterprise Data Services (EDS) 製品のサポート。
1.8. JBoss Enterprise SOA Platform の機能 リンクのコピーリンクがクリップボードにコピーされました!
- JBoss Enterprise Service Bus (ESB)
- ESB はサービス間でメッセージを送信し、異なるタイプのシステムで処理できるようにメッセージを変換します。
- Business Process Execution Language (BPEL)
- Web サービスを使用して、BPEL 言語でビジネスルールをオーケストレーションできます。BPEL 言語は、ビジネスプロセス命令を簡単に実行するために SOA に含まれています。
- Java Universal Description、Discovery and Integration (jUDDI)
- これは SOA のデフォルトサービスレジストリーで、ESB 上のサービスに関するすべての情報が格納される場所です。
- Smooks
- この変換エンジンは SOA と組み合わせて使用してメッセージを処理できます。また、メッセージを分割して正しい宛先に送信するためにも使用できます。
- JBoss ルール
- これは、SOA にパッケージ化されたルールエンジンです。受信するメッセージからデータを推測して、実行する必要があるアクションを判別できます。
1.9. JBoss Enterprise SOA Platform の JBossESB コンポーネントの機能 リンクのコピーリンクがクリップボードにコピーされました!
- 複数のトランスポートおよびプロトコル
- リスナーアクションモデル (これにより、サービスを相互に選択可能)
- コンテンツベースのルーティング (JBoss Rules エンジン、XPath、Regex、および Smooks 経由)
- サービスオーケストレーション機能を提供するための JBoss Business Process Manager (jBPM) との統合
- ビジネスルールの開発機能を提供するための JBoss ルールとの統合
- BPEL エンジンとの統合
- さまざまなトランスポート機能 (電子メールや JMS など) で動作するように設定されている。
- 汎用オブジェクトリポジトリーとして使用する。
- プラグ可能なデータ変換機能を実装できる。
- インタラクションのログをサポートする。
org.jboss.internal.soa.esb と org.jboss.soa.esb の 2 つのツリーがあります。org.jboss.internal.soa.esb パッケージの内容をそのまま使用します。これは、通知なしに変更される可能性があるためです。これとは対照的に、org.jboss.soa.esb パッケージ内のすべての内容は、Red Hat の非推奨ポリシーの対象となっています。
1.10. タスク管理 リンクのコピーリンクがクリップボードにコピーされました!
1.11. 統合のユースケース リンクのコピーリンクがクリップボードにコピーされました!
1.12. ビジネス環境での JBoss Enterprise SOA Platform の使用 リンクのコピーリンクがクリップボードにコピーされました!
第2章 はじめに リンクのコピーリンクがクリップボードにコピーされました!
2.1. 対象読者 リンクのコピーリンクがクリップボードにコピーされました!
2.2. ガイドの目的 リンクのコピーリンクがクリップボードにコピーされました!
2.3. データのバックアップ リンクのコピーリンクがクリップボードにコピーされました!
2.4. Red Hat ドキュメントサイト リンクのコピーリンクがクリップボードにコピーされました!
第3章 基本情報 リンクのコピーリンクがクリップボードにコピーされました!
3.1. Smooks リンクのコピーリンクがクリップボードにコピーされました!
3.2. Smooks のビジターロジック リンクのコピーリンクがクリップボードにコピーされました!
3.3. メッセージフラグメントの処理 リンクのコピーリンクがクリップボードにコピーされました!
Templating:XSLT または FreeMarker を使用して、メッセージフラグメントを変換するJava バインド:バインドメッセージフラグメントデータを Java オブジェクトにSplitting:メッセージフラグメントを分割し、分割フラグメントを複数のトランスポートと宛先にルーティングします。エンリッチ:データベースからのデータでメッセージフラグメントをエンリッチします。Persistence:メッセージフラグメントデータをデータベースに保持します。Validation:メッセージフラグメントデータに基本的または複雑な検証を実行します。
3.4. 基本処理モデル リンクのコピーリンクがクリップボードにコピーされました!
- XML から XML
- XML to Java
- Java から XML
- Java から Java
- EDI から XML
- EDI から Java
- Java から EDI へ
- CSV から XML
3.5. サポート対象のモデル リンクのコピーリンクがクリップボードにコピーされました!
- Simple API for XML (SAX)
- SAX イベントモデルは、XML ソースから生成できる階層 SAX イベントに基づいています。これらには、
startElementとendElementが含まれます。EDI、CSV、および Java ファイルなど、他の構造化された階層的なデータソースに適用します。 - ドキュメントオブジェクトモデル (DOM)
- このオブジェクトモデルを使用して、メッセージソースとその最終結果をマッピングします。
visitBefore と visitAfter が付きます。
3.6. FreeMarker リンクのコピーリンクがクリップボードにコピーされました!
NodeModel を作成し、テンプレート操作のドメインモデルとして使用できます。Smooks は、この機能にフラグメントベースのテンプレート変換を実行する機能、およびモデルを巨大なメッセージに適用する機能を追加します。
3.7. SAX の使用例 リンクのコピーリンクがクリップボードにコピーされました!
前提条件
- 実装された SAXVisitor インターフェイスが必要です。(プロセスのイベントに対応するインターフェイスを選択します。)
- この例では、
ExecutionContext名を使用しています。これは、BoundAttributeStoreクラスを拡張する パブリックインターフェイス です。
手順3.1 タスク
- 新しい Smooks 設定を作成します。これは、<xxx> 要素の
visitBeforeおよびvisitAfterイベントでビジターロジックを適用するために使用されます。 visitBeforeおよびvisitAfterイベントのロジックをイベントストリーム全体の特定の要素に適用します。ビジターロジックは、<xxx> 要素のイベントに適用されます。- FreeMarker で Smooks を使用して、巨大なメッセージに XML から XML への変換を実行します。
- 次のソース形式を挿入します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - このターゲット形式を挿入します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次の Smooks 設定を使用します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - このコードを使用して、実行します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - その結果、XML から XML への変換が行われます。
3.8. カートリッジ リンクのコピーリンクがクリップボードにコピーされました!
3.9. 付属カートリッジ リンクのコピーリンクがクリップボードにコピーされました!
- Calc:"milyn-smooks-calc"
- CSV: "milyn-smooks-csv"
- 固定長リーダー: milyn-smooks-fixed-length
- EDI: "milyn-smooks-edi"
- Javabean: milyn-smooks-javabean
- JSON: "milyn-smooks-json"
- ルーティング: milyn-smooks-routing
- テンプレート: milyn-smooks-templating
- CSS: "milyn-smooks-css"
- サーブレット: "milyn-smooks-servlet"
- 保持: milyn-smooks-persistence
- 検証: milyn-smooks-validation
3.10. セレクター リンクのコピーリンクがクリップボードにコピーされました!
3.11. セレクターの使用 リンクのコピーリンクがクリップボードにコピーされました!
- 設定は、読みやすさのために、厳密に型指定されており、ドメイン固有です。
- 設定は XSD ベースです。これにより、統合開発環境 を使用する際、オートコンプリートがサポートされます。
- 特定のリソースタイプ (Java バインドの
BeanPopulatorクラスなど) に実際のハンドラーを定義する必要はありません。
3.12. namespace の宣言 リンクのコピーリンクがクリップボードにコピーされました!
手順3.2 タスク
- コア設定 namespace によって namespace の接頭辞から URI へのマッピングを設定し、次の XML コードを変更して、使用する namespace を含めます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.13. フィルタリングプロセスの選択 リンクのコピーリンクがクリップボードにコピーされました!
- DOM ビジターインターフェイス (
DOMElementVisitorおよびSerializationUnit) のみが適用されている場合、DOM 処理モデルは自動的に選択されます。 - すべてのビジターリソースが SAX ビジターインターフェイス (
SAXElementVisitor) のみを使用する場合は、SAX 処理モデルが自動的に選択されます。 - ビジターリソースが DOM と SAX の両方のインターフェイスを使用する場合は、Smooks リソース設定ファイルで SAX を指定しないかぎり、デフォルトでは、DOM 処理モデルが選択されます。(これは、
<core:filterSettings type="SAX" />を使用すると、実行されます。)
リーダー などの 非要素のビジターリソースは 含まれません。
3.14. Smooks 1.3 でフィルタータイプを SAX に設定する例 リンクのコピーリンクがクリップボードにコピーされました!
3.15. DomModelCreator リンクのコピーリンクがクリップボードにコピーされました!
3.16. DOM モデルと SAX モデルの混合 リンクのコピーリンクがクリップボードにコピーされました!
- ノードトラバーサル (つまり、ノード間の情報の送信) と既存のスクリプト/テンプレートエンジンに DOM (ドキュメントオブジェクトモデル) を使用します。
DomModelCreatorビジタークラスを使用して、SAX モデルと DOM モデルを混在させます。このビジターは、SAX フィルタリングで使用すると、ビジットされた要素から DOM フラグメントを構成します。これにより、ストリーミング環境内で DOM ユーティリティーを使用できます。- 複数のモデルがネストされている場合、外側のモデルに内側のモデルのデータが含まれることはありません (つまり、同じフラグメントが 2 つのモデル内に共存することはありません)。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.17. DomModelCreator の設定 リンクのコピーリンクがクリップボードにコピーされました!
- Smooks 内から DomModelCreator を設定して、order および注文品目メッセージフラグメントのモデルを作成します。以下の例を参照してください。
<resource-config selector="order,order-item"> <resource>org.milyn.delivery.DomModelCreator</resource> </resource-config><resource-config selector="order,order-item"> <resource>org.milyn.delivery.DomModelCreator</resource> </resource-config>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のように、
orderのメモリー内モデルを設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記新しいモデルごとに前のモデルが上書きされるため、一度に複数の注文品目モデルがメモリーに存在することはありません。
3.18. DomModelCreator に関する詳細情報 リンクのコピーリンクがクリップボードにコピーされました!
- FreeMarker テンプレート: http://www.smooks.org/mediawiki/index.php?title=V1.3:xml-to-xml
3.19. Bean コンテキスト リンクのコピーリンクがクリップボードにコピーされました!
Smooks.filterSource 操作を使用)。カートリッジが作成するすべての Bean は、その beanId に従って、ファイルされます。
3.20. Bean コンテキストの設定 リンクのコピーリンクがクリップボードにコピーされました!
Smooks.filterSourceプロセスの最後に Bean コンテキストのコンテンツを返すには、Smooks.filterSourceメソッドの呼び出しでorg.milyn.delivery.java.JavaResultオブジェクトを指定します。この例は、次の方法を示しています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 起動時に Bean コンテキストにアクセスするには、これを
BeanContextオブジェクトで指定します。getBeanContext()メソッドでExecutionContextから取得できます。 BeanContextからオブジェクトを追加または取得する場合は、まず、beanIdStoreからbeanIdオブジェクトを取得してください。(beanIdオブジェクトは、文字列キーもサポートされていますが、文字列キーよりも高いパフォーマンスを保証する特殊なキーです。)getbeanIdStore()メソッドを使用して、ApplicationContextからbeanIdStoreを取得する必要があります。beanIdオブジェクトを作成するには、register("beanId name")メソッドを呼び出します。(beanId がすでに登録されていることがわかっている場合は、getbeanId("beanId name")メソッドを呼び出すと、取得できます)。beanIdオブジェクトはApplicationContextスコープのオブジェクトです。それらをカスタムビジター実装の初期化メソッドに登録してから、ビジターオブジェクトにプロパティーとして配置します。その後、それらをvisitBeforeおよびvisitAfterメソッドで使用できます。(beanIdオブジェクトとbeanIdStoreはスレッドセーフです。)
3.21. プリインストールされた Bean リンクのコピーリンクがクリップボードにコピーされました!
PUUID: UniqueId Bean。この Bean は、フィルタリングExecutionContextに一意の識別子を提供します。PTIME: 時間 Bean。この Bean は、フィルタリングExecutionContextに時間ベースのデータを提供します。
- ExecutionContext の一意の ID (フィルタリングされるメッセージ):
$PUUID.execContext - ランダムな一意の ID:
$PUUID.random - メッセージフィルタリングの開始時間 (ミリ秒単位):
$PTIME.startMillis - メッセージフィルタリングの開始時間 (ナノ秒単位):
$PTIME.startNanos - メッセージフィルタリングの開始時間 (日付):
$PTIME.startDate - 現在時間 (ミリ秒単位):
$PTIME.nowMillis - 現在時間 (ナノ秒単位):
$PTIME.nowNanos - 現在時間 (日付):
$PTIME.nowDate
3.22. 複数の出力/結果 リンクのコピーリンクがクリップボードにコピーされました!
- 結果内インスタンスで。これらは、
Smooks.filterSourceメソッドに渡された結果インスタンスで返されます。 - フィルタリングプロセス中。これは、フィルタリングプロセス中に生成され、外部エンドポイント (ESB サービス、ファイル、JMS 宛先、データベースなど) に送信される出力によって実現されます。メッセージフラグメントイベントは、外部エンドポイントへの自動ルーティングをトリガーします。
3.23. 結果内インスタンスの作成 リンクのコピーリンクがクリップボードにコピーされました!
- API に見られるように、複数の結果インスタンスを Smooks に提供します。
public void filterSource(Source source, Result... results) throws SmooksException
public void filterSource(Source source, Result... results) throws SmooksExceptionCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記Smooks は、同じタイプの複数の結果インスタンスからの結果データの取得をサポートしていません。たとえば、Smooks.filterSourceメソッド呼び出しで複数の StreamResult インスタンスを指定できますが、Smooks は、これらの StreamResult インスタンスのうち 1 つ (最初の 1 つ) のみに出力します。
3.24. サポート対象の結果タイプ リンクのコピーリンクがクリップボードにコピーされました!
JDK StreamResult および DOMResult の結果タイプだけでなく、次の特殊なタイプでも動作します。
JavaResult: この結果タイプを使用して、Smooks Java Bean コンテキストの内容を取得します。ValidationResult: この結果タイプを使用して、出力を取得します。- シンプルな結果タイプ: テストを書く際、これを使用します。これは、
StringWriterをラップするStreamResult拡張です。
3.25. イベントストリームの結果 リンクのコピーリンクがクリップボードにコピーされました!
StreamResult または DOMResult が Smooks.filterSource 呼び出しで提供される場合、デフォルトでは、Smooks はイベントストリーム (ソースによって生成される) を提供された結果に XML としてシリアル化します。(シリアル化の前に、ビジターロジックをイベントストリームに適用できます。)
3.26. フィルタリングプロセス中 リンクのコピーリンクがクリップボードにコピーされました!
Smooks.filterSource プロセス中に、さまざまな出力を生成します。(これは、メッセージの最後に到達する前に、メッセージイベントストリーム中に、発生します。) この例は、他のプロセスによる実行のために、メッセージフラグメントを分割して、さまざまなエンドポイントにルーティングするために使用される場合です。
3.27. Smooks 実行プロセスの確認 リンクのコピーリンクがクリップボードにコピーされました!
- Smooks から実行レポートを取得するには、レポートを生成するように、
ExecutionContextクラスを設定する必要があります。(Smooks は、メッセージを処理する際、イベントを発行します。) 次のサンプルコードは、HTML レポートを生成するように、Smooks を設定する方法を示しています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow HtmlReportGenerator機能を使用すると、デバッグ時に役立ちます。注記Web ページ http://www.milyn.org/docs/smooks-report/report.html でサンプルレポートを確認できます。注記また、カスタムのExecutionEventListener実装を作成できます。
3.28. フィルタリングプロセスの終了 リンクのコピーリンクがクリップボードにコピーされました!
- メッセージの最後に到達する前に、Smooks フィルタリングプロセスを終了するには、<
core:terminate> 設定を Smooks 設定に追加します。(これは SAX で機能し、DOM では必要ありません。)メッセージの顧客フラグメントの最後でフィルタリングを終了する設定例は次のとおりです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - メッセージの先頭で終了するには (
visitBeforeイベント)、次のコードを使用します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.29. グローバル設定 リンクのコピーリンクがクリップボードにコピーされました!
- デフォルトプロパティー
- デフォルトプロパティーは、
<resource-config>属性のデフォルト値を指定します。これらのプロパティーは、対応する<resource-config>が属性の値を指定しない場合、SmooksResourceConfigurationクラスに自動的に適用されます。 - グローバルパラメーター
- すべての
<resource-config>の<param>要素を指定できます。これらのパラメーター値は、SmooksResourceConfigurationによって実行時に利用できるか、そうでない場合は、@ConfigParamアノテーションによって注入されます。グローバル設定パラメーターは 1 か所に定義されます。すべてのランタイムコンポーネントは、ExecutionContextを使用して、それらにアクセスできます。
3.30. グローバル設定パラメーター リンクのコピーリンクがクリップボードにコピーされました!
- 次のように、グローバルパラメーターは、
<params>要素で指定されます。<params> <param name="xyz.param1">param1-val</param> </params><params> <param name="xyz.param1">param1-val</param> </params>Copy to Clipboard Copied! Toggle word wrap Toggle overflow ExecutionContextでグローバルパラメーターにアクセスします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.31. デフォルトプロパティー リンクのコピーリンクがクリップボードにコピーされました!
smooks-conf.xml ファイルのリソース設定に適用されます。すべてのリソース設定のセレクター値が同じである場合は、default-selector=order を指定できます。つまり、すべてのリソース設定でセレクターを指定する必要はありません。
3.32. デフォルトプロパティーの設定例 リンクのコピーリンクがクリップボードにコピーされました!
3.33. デフォルトプロパティーのオプション リンクのコピーリンクがクリップボードにコピーされました!
- default-selector
- 他のセレクターが定義されていない場合、これは、Smooks 設定ファイル内のすべての resource-config 要素に適用されます。
- default-selector-namespace
- これはデフォルトのセレクター namespace です。他の namespace が定義されていない場合に使用されます。
- default-target-profile
- これはデフォルトのターゲットプロファイルです。他のターゲットプロファイルが定義されていない場合、Smooks 設定ファイル内のすべてのリソースに適用されます。
- default-condition-ref
- これは、条件識別子によってグローバル条件を参照します。この条件は、グローバルに定義された条件を参照しない空の条件要素 (つまり、<condition/>) を定義するリソースに適用されます。
3.34. フィルター設定 リンクのコピーリンクがクリップボードにコピーされました!
- フィルタリングオプションを設定するには、smooks-core 設定 namespace を使用します。以下の例を参照してください。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.35. フィルターオプション リンクのコピーリンクがクリップボードにコピーされました!
- type
- これにより、SAX または DOM のいずれかから使用される処理モデルのタイプが決まります。(デフォルトは DOM です。)
- defaultSerialization
- これは、デフォルトのシリアル化をオンにするかどうかを決定します。デフォルト値は
trueです。これをオンにすると、Smooks.filterSourceメソッドに提供された結果オブジェクトのStreamResult(またはDOMResult) を探し、デフォルトでは、その結果に対するすべてのイベントをシリアル化するように、Smooks に指示します。グローバル設定パラメーターを使用して、この動作をオフにするか、結果ライターの所有権を取得する (SAX フィルタリングを使用する場合) か、DOM を変更する (DOM フィルタリングを使用する場合) フラグメントのビジター実装をターゲットにして、フラグメント単位でこの動作をオーバーライドできます。 - terminateOnException
- これを使用して、例外によって処理を終了する必要があるかどうかを判断します。デフォルト設定は
trueです。 - closeSource
- これにより、
Smooks.filterSourceメソッドに渡されたソースインスタンスストリームが閉じます (デフォルトはtrue)。ここでの例外は、まったく閉じられないSystem.inです。 - closeResult
- これにより、
Smooks.filterSourceメソッドに渡された結果ストリームが閉じます (デフォルトはtrue)。ここでの例外は、まったく閉じないSystem.outとSystem.errです。 - rewriteEntities
- これを使用して、XML の読み取りおよび書き込み (デフォルトのシリアル化) 時に XML エンティティーを書き換えます。
- readerPoolSize
- これにより、リーダープールのサイズが設定されます。一部のリーダーの実装は、作成に非常にコストがかかります。リーダーインスタンスをプールする (つまり、それらを再利用する) と、特に多くの小さなメッセージを処理する場合は、パフォーマンスが大幅に向上する可能性があります。この設定のデフォルト値は
0です (つまり、プールされません。メッセージごとに新しいリーダーインスタンスが作成されます)。アプリケーションのスレッドモデルに合わせて、これを設定します。
第4章 入力データの消費 リンクのコピーリンクがクリップボードにコピーされました!
4.1. ストリームリーダー リンクのコピーリンクがクリップボードにコピーされました!
XMLReader インターフェイス (または SmooksXMLReader インターフェイス) を実装するクラスです。Smooks は、ストリームリーダーを使用して、ソースメッセージデータストリームから SAX イベントのストリームを生成します。 XMLReaderFactory.createXMLReader() はデフォルトの XMLReader です。特殊な XML リーダーを設定することにより、非 XML データソースを読み取るように設定できます。
4.2. XMLReader の設定 リンクのコピーリンクがクリップボードにコピーされました!
4.3. XML リーダーの機能の設定 リンクのコピーリンクがクリップボードにコピーされました!
- デフォルトでは、Smooks は XML データを読み取ります。デフォルトの XML リーダーに機能を設定するには、設定からクラス名を省略します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.4. CSV リーダーの設定 リンクのコピーリンクがクリップボードにコピーされました!
- リーダーを設定するには、http://www.milyn.org/xsd/smooks/csv-1.2.xsd 設定 namespace を使用します。基本的な設定は次のとおりです。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のイベントストリームが表示されます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.5. 設定の定義 リンクのコピーリンクがクリップボードにコピーされました!
- XML 設定でフィールドを定義するには、 fields 属性で名前のコンマ区切りリストを使用する必要があります。
- フィールド名が XML 要素名と同じ命名規則に従っていることを確認してください。
- 文字、数字、その他の文字を含めることができる
- 数字または句読点で始めることはできない
- 文字 xml (または XML や Xml など) で開始することはできない
- スペースを含めることはできない
- csv-set および csv-record 要素名を変更できるように、rootElementName および recordElementName 属性を設定します。これらの名前にも同じルールが適用されます。
- フィールドごとに文字列操作関数を定義できます。これらの関数は、データが SAX イベントに変換される前に、実行されます。フィールド名の後に定義し、2 つを疑問符で区切ります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Smooks が CSV レコードのフィールドを無視するようにするには、フィールドの設定値として $ignore$ トークンを指定する必要があります。$ignore$ トークンの後に数字を続けるだけで、無視するフィールドの数を指定します (したがって、
$ignore$3を使用して、次の 3 つのフィールドを無視します)。$ignore$+を使用して、CSV レコードの最後まで、すべてのフィールドを無視します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.6. CSV レコードを Java オブジェクトにバインドする リンクのコピーリンクがクリップボードにコピーされました!
- CSV レコードを Java オブジェクトに変換する方法については、以下をお読みください。この例では、CSV レコードを個人に使用します。
Tom,Fennelly,Male,4,Ireland Mike,Fennelly,Male,2,Ireland
Tom,Fennelly,Male,4,Ireland Mike,Fennelly,Male,2,IrelandCopy to Clipboard Copied! Toggle word wrap Toggle overflow - このコードを入力して、レコードを個人にバインドします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のコードを入力し、タスクに合わせて、変更します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 設定を実行するには、次のコードを使用します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - CSV レコードセットからマップを作成できます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 上記の設定では、個人ごとの firstname 値に応じた個人インスタンスのマップが生成されます。実行方法は次のとおりです。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 仮想モデルもサポートされているため、class 属性をjava.util.Mapとして定義し、CSV フィールド値をバインドして、インスタンスをマッピングし、リストまたはマップに追加できます。
4.7. レコードセットの CSV リーダーの設定 リンクのコピーリンクがクリップボードにコピーされました!
- CSV リーダーを使用して、Smooks インスタンスを設定し、個人レコードセットを読み取るには、以下のコードを使用します。レコードを個人インスタンスのリストにバインドします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記オプションで Java Bean を設定することもできます。代わりに (または追加で)、他のビジター実装を使用して、CSV レコードセットを処理するように、Smooks インスタンスをプログラムで設定できます。 - CSV レコードのデータを反映する Java 型のリストまたはマップに CSV のレコードをバインドするには、
CSVListBinderまたはCSVMapBinderクラスを使用します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow バインドプロセスをさらに制御する必要がある場合は、下位レベルの API の使用に戻ります。
4.8. 固定長リーダーの設定 リンクのコピーリンクがクリップボードにコピーされました!
- 固定長リーダーを設定するには、次のように、http://www.milyn.org/xsd/smooks/fixed-length-1.3.xsd 設定 namespace を変更します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 入力ファイルの例は次のとおりです。#HEADER Tom Fennelly M 21 IE Maurice Zeijen M 27 NL
#HEADER Tom Fennelly M 21 IE Maurice Zeijen M 27 NLCopy to Clipboard Copied! Toggle word wrap Toggle overflow 生成されるイベントストリームは次のとおりです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のように、文字列操作関数を定義します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 選択した場合は、これらのフィールドを無視することもできます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.9. 固定長レコードの設定 リンクのコピーリンクがクリップボードにコピーされました!
- 固定長レコードを個人にバインドするには、以下の設定を参照してください。この例では、次のサンプルレコードを使用します。
Tom Fennelly M 21 IE Maurice Zeijen M 27 NL
Tom Fennelly M 21 IE Maurice Zeijen M 27 NLCopy to Clipboard Copied! Toggle word wrap Toggle overflow これは、個人にそれらをバインドする方法です。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のように、レコードを設定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のように、実行します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - オプションで、この設定を使用して、固定長レコードセットからマップを作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - これは、生成された個人インスタンスのマップを実行する方法です。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 仮想モデルもサポートされているため、class 属性を java.util.Map として定義し、固定長フィールド値をバインドして、インスタンスをマッピングし、リストまたはマップに追加することができます。
4.10. プログラムによる固定長リーダーの設定 リンクのコピーリンクがクリップボードにコピーされました!
- 次のコードを使用して、個人レコードセットを読み取るように、固定長リーダーを設定し、レコードセットを個人インスタンスのリストにバインドします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Java バインドの設定は必須ではありません。代わりに、他のビジター実装を使用して、固定長レコードセットにさまざまな形式の処理を実行するように、Smooks インスタンスをプログラムで設定できます。 - 固定長レコードを、固定長レコードのデータを反映する Java 型のリストまたはマップに直接バインドするには、FixedLengthListBinder クラスまたは FixedLengthMapBinder クラスを使用します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow バインドプロセスをさらに制御する必要がある場合は、下位レベルの API に戻ります。
4.11. EDI 処理 リンクのコピーリンクがクリップボードにコピーされました!
- Smooks で EDI 処理を利用するには、http://www.milyn.org/xsd/smooks/edi-1.2.xsd 設定 namespace にアクセスします。
- ニーズに合わせて、この設定を変更します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.12. EDI 処理条件 リンクのコピーリンクがクリップボードにコピーされました!
- mappingModel: これは、EDI メッセージストリームを Smooks で処理できる SAX イベントのストリームに変換するための EDI マッピングモデル設定を定義します。
- validate: この属性は、EDI パーサーでのデータ型の検証をオンまたはオフにします。(デフォルトでは、検証はオンになっています。) 冗長性を避けるために、EDI データが Java オブジェクトモデルにバインドされている場合は、EDI リーダーでデータ型の検証をオフにします (jb:bean のような Java バインドを使用)。
4.13. EDI から SAX リンクのコピーリンクがクリップボードにコピーされました!
4.14. EDI から SAX へのイベントマッピング リンクのコピーリンクがクリップボードにコピーされました!
- セグメントコード (segcode) の完全一致。
- segcode 属性が正規表現パターンを定義するフルセグメントの正規表現パターンマッチ (たとえば、
segcode="1A\*a.*")。 - 必須: フィールド、コンポーネント、およびサブコンポーネントの設定は、そのフィールド、コンポーネント、またはサブコンポーネントに値が必要であるというフラグを立てる必須の属性をサポートします。
- デフォルトでは、値は必要ありません (フィールド、コンポーネント、およびサブコンポーネント)。
- truncatable: セグメント、フィールド、およびコンポーネント設定は、truncatable 属性をサポートします。セグメントの場合は、つまり、そのセグメントが必須ではない後続フィールドを指定していない場合、パーサーエラーは生成されません (上記の必須の属性を参照)。フィールド/コンポーネントおよびコンポーネント/サブコンポーネントについても同様です。
- デフォルトでは、セグメント、フィールド、およびコンポーネントは切り捨てられません。
- 値とともに存在する (
required="true") - 値なしで存在する (
required="false") - 存在しない (
required="false" and truncatable="true")
4.15. セグメント定義 リンクのコピーリンクがクリップボードにコピーされました!
4.16. セグメント用語 リンクのコピーリンクがクリップボードにコピーされました!
- segref: これには、インポートするセグメントを参照する namespace:name が含まれます。
- truncatableSegments: これは、インポートされたリソースマッピングファイルで指定された truncatableSegments をオーバーライドします。
- truncatableFields: これは、インポートされたリソースマッピングファイルで指定された truncatableFields をオーバーライドします。
- truncatableComponents: これは、インポートされたリソースマッピングファイルで指定された truncatableComponents をオーバーライドします。
4.17. type 属性 リンクのコピーリンクがクリップボードにコピーされました!
- フィールド検証
- Edifact Java コンパイル
4.18. EDIReaderConfigurator リンクのコピーリンクがクリップボードにコピーされました!
- 次のコードのように、EDIReaderConfigurator を使用して、EDIReader を使用するように、Smooks インスタンスをプログラムで設定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.19. Edifact Java コンパイラー リンクのコピーリンクがクリップボードにコピーされました!
- 特定の EDI マッピングモデルの Java オブジェクトモデル。
- EDI マッピングモデルによって記述された EDI メッセージのインスタンスから Java オブジェクトモデルを取り込むための Smooks Java バインド設定。
- Edifact Java コンパイラー を使用して、EDI データを Java オブジェクトモデルにバインドするためのファクトリークラス。
4.20. Edifact Java コンパイラーの例 リンクのコピーリンクがクリップボードにコピーされました!
4.21. Edifact Java コンパイラーの実行 リンクのコピーリンクがクリップボードにコピーされました!
- Maven によって Edifact Java Compiler を実行するには、POM ファイルにプラグインを追加します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.22. Edifact Java コンパイラーの Maven プラグインパラメーター リンクのコピーリンクがクリップボードにコピーされました!
- ediMappingFile: Maven プロジェクト内の EDI マッピングモデルファイルへのパス。(オプションです。デフォルトは
src/main/resources/edi-model.xmlです。) - packageName: 生成された Java アーティファクトが配置される Java パッケージ (Java オブジェクトモデルとファクトリークラス)。
- destDir: 生成されたアーティファクトが作成およびコンパイルされるディレクトリー。(オプションです。デフォルトは
target/ejcです。)
4.23. Ant による Edifact Java コンパイラーの実行 リンクのコピーリンクがクリップボードにコピーされました!
- 次のように、EJC タスクを作成および実行します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.24. UN/EDIFACT メッセージ交換 リンクのコピーリンクがクリップボードにコピーされました!
- 公式の UN/EDIFACT メッセージ定義 ZIP ディレクトリーから生成された、事前生成された EDI マッピングモデル。これらを使用すると、UN/EDIFACT メッセージ交換をより使いやすい XML 形式に変換できます。
- 純粋な Java を使用して、UN/EDIFACT 交換を簡単に読み書きできるように、事前に生成された Java バインド
4.25. edi:reader で UN/EDIFACT 交換を使用する リンクのコピーリンクがクリップボードにコピーされました!
- 次のように、http://www.milyn.org/xsd/smooks/unedifact-1.4.xsd namespace を設定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow mappingModel 属性は、読者が使用するマッピングモデル ZIP セットの Maven アーティファクトを参照する URN を定義します。
4.26. UN/EDIFACT 交換を使用するように、Smooks を設定する リンクのコピーリンクがクリップボードにコピーされました!
- UN/EDIFACT 交換を使用するように、Smooks をプログラムで設定するには (たとえば、UNEdifactReaderConfigurator によって)、次のコードを使用します。
Smooks smooks = new Smooks(); smooks.setReaderConfig(new UNEdifactReaderConfigurator("urn:org.milyn.edi.unedifact:d03b-mapping:v1.4"));Smooks smooks = new Smooks(); smooks.setReaderConfig(new UNEdifactReaderConfigurator("urn:org.milyn.edi.unedifact:d03b-mapping:v1.4"));Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 含まれているアプリケーションのクラスパスに次を挿入します。
- 必要な EDI マッピングモデル
- Smooks EDI カートリッジ
- 設定に必要な複数の Maven 依存関係がある場合があります。以下の例を参照してください。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - アプリケーションがクラスパスに EDI マッピングモデルの ZIP セットを追加したら、unedifact:reader 設定の mappingModel 属性値として URN を使用して Maven アーティファクトを参照するだけで、このモデルを使用するように、Smooks を設定できます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.27. mappingModel リンクのコピーリンクがクリップボードにコピーされました!
SNAPSHOT および Central リポジトリーから取得し、標準の Maven 依存関係管理を使用して、アプリケーションに追加します。
4.28. mappingModel の設定 リンクのコピーリンクがクリップボードにコピーされました!
- D93A マッピングモデル ZIP セットをアプリケーションクラスパスに追加するには、アプリケーションの POM ファイルに次の依存関係を設定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のように、
unedifact:reader設定を Smooks 設定に追加して、この ZIP セットを使用するように、Smooks を設定します。<unedifact:reader mappingModel="urn:org.milyn.edi.unedifact:d93a-mapping:v1.4" />
<unedifact:reader mappingModel="urn:org.milyn.edi.unedifact:d93a-mapping:v1.4" />Copy to Clipboard Copied! Toggle word wrap Toggle overflow Maven アーティファクトの依存情報から派生した URN を使用して、リーダーを設定する方法に注意してください。 - 複数のマッピングモデル ZIP セットをアプリケーションのクラスパスに追加することもできます。これを行うには、URN をコンマで区切って、
unedifact:reader設定にそのすべてを追加します。 - ツールには、事前生成された Java バインドモデルセットが用意されています (マッピングモデルの ZIP セットごとに 1 つ存在します)。これらを使用して、生成された非常に単純なファクトリークラスを使用して、UN/EDIFACT 交換を処理します。
4.29. D03B UN/EDIFACT メッセージ交換の処理 リンクのコピーリンクがクリップボードにコピーされました!
- D03B UN/EDIFACT メッセージ交換を処理するには、次の例に従います。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Maven を使用して、そのディレクトリーのバインド依存関係を追加することにより、D03B メッセージ交換を処理する機能を追加します (Maven
SNAPSHOTおよびCentralリポジトリーによって配布される、事前に生成された UN/EDIFACT Java オブジェクトモデルを使用することもできます)。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.30. JSON データの処理 リンクのコピーリンクがクリップボードにコピーされました!
- JSON データを処理するには、JSON リーダーを設定する必要があります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次の設定オプションを使用して、ルート、ドキュメント、および配列要素の XML 名を設定します。
- rootName: これはルート要素の名前です。デフォルトは yaml です。
- elementName: これはシーケンス要素の名前です。デフォルトは要素です。
- XML 要素名で許可されていない文字をキー名で使用する場合があります。リーダーは、この問題に複数の解決策を提供します。空白、不正な文字、数字で始まるキー名の数字を検索および置換できます。これを使用して、1 つのキー名を完全に別のものに置換することもできます。次のサンプルコードは、これを行う方法を示しています。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - keyWhitspaceReplacement: これは、JSON マップキーの空白の置換文字です。デフォルトでは、これは定義されていないため、リーダーは空白を自動的に検索しません。
- keyPrefixOnNumeric: これは、JSON ノード名が数字で始まる場合に追加する接頭辞文字です。デフォルトでは、これは定義されていないため、リーダーは数字で始まる要素名を検索しません。
- illegalElementNameCharReplacement: JSON 要素名で不正な文字が検出された場合、それらはこの値に置換されます。
- 次のオプション設定を行うこともできます。
- nullValueReplacement: これは、JSON null 値の置換文字列です。デフォルトは空の文字列です。
- encoding: これは、リーダーによって処理される JSON メッセージ InputStream のデフォルトのエンコードです。デフォルトのエンコードは UTF-8 です。注記この機能は非推奨です。代わりに、
java.io.ReaderをSmooks.filterSource()メソッドに指定して、JSON ストリームソースの文字エンコードを管理する必要があります。
- JSON 設定を読み取るように、Smooks をプログラムで設定するには、
JSONReaderConfiguratorクラスを使用します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.31. JSON データの処理時、XML で許可されていない文字を使用する リンクのコピーリンクがクリップボードにコピーされました!
- keyWhitspaceReplacement: これは、JSON マップキーの空白の置換文字です。デフォルトでは、これは定義されていないため、リーダーは空白を自動的に検索しません。
- keyPrefixOnNumeric: これは、JSON ノード名が数字で始まる場合に追加する接頭辞文字です。デフォルトでは、これは定義されていないため、リーダーは数字で始まる要素名を検索しません。
- illegalElementNameCharReplacement: JSON 要素名で不正な文字が検出された場合、それらはこの値に置換されます。
- nullValueReplacement: これは、JSON null 値の置換文字列です。デフォルトは空の文字列です。
- encoding: これは、リーダーによって処理される JSON メッセージ InputStream のデフォルトのエンコードです。デフォルトのエンコードは UTF-8 です。注記この機能は非推奨です。代わりに、
java.io.ReaderをSmooks.filterSource()メソッドに指定して、JSON ストリームソースの文字エンコードを管理する必要があります。
4.32. YAML ストリームの設定 リンクのコピーリンクがクリップボードにコピーされました!
手順4.1 タスク
- 次のように、YAML ファイルを処理するように、リーダーを設定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 複数のドキュメントを含むように、YAML ストリームを設定します。リーダーは、ドキュメント要素をルート要素の子として追加して、これを処理します。1 つの空の YAML ドキュメントを含む XML シリアル化された YAML ストリームは次のようになります。
<yaml> <document> </document> </yaml><yaml> <document> </document> </yaml>Copy to Clipboard Copied! Toggle word wrap Toggle overflow YamlReaderConfiguratorクラスを利用して、YAML 設定を読み取るように、Smooks をプログラムで設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.33. サポート対象の結果タイプ リンクのコピーリンクがクリップボードにコピーされました!
JDK StreamResult および DOMResult の結果タイプだけでなく、次の特殊なタイプでも動作します。
JavaResult: この結果タイプを使用して、Smooks Java Bean コンテキストの内容を取得します。ValidationResult: この結果タイプを使用して、出力を取得します。- シンプルな結果タイプ: テストを書く際、これを使用します。これは、
StringWriterをラップするStreamResult拡張です。
4.34. YAML データの処理時、XML で許可されていない文字を使用する リンクのコピーリンクがクリップボードにコピーされました!
- XML 要素名で許可されていない文字をキー名で使用できます。リーダーは、この問題に複数の解決策を提供します。空白、不正な文字、数字で始まるキー名の数字を検索および置換できます。次のように、1 つのキー名を完全に別のものに置換するように、設定できます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.35. YAML で XML を置換するためのオプション リンクのコピーリンクがクリップボードにコピーされました!
- keyWhitspaceReplacement: これは、YAML マップキーの空白の置換文字です。デフォルトでは、これは定義されていません。
- keyPrefixOnNumeric: YAML ノード名が数字で始まる場合は、この接頭辞を追加します。デフォルトでは、これは定義されていません。
- illegalElementNameCharReplacement: YAML 要素名で不正な文字が検出された場合、それらは、この値に置換されます。デフォルトでは、これは定義されていません。
4.36. YAML のアンカーとエイリアス リンクのコピーリンクがクリップボードにコピーされました!
- REFER: リーダーは、アンカーまたはエイリアスを持つ要素に参照属性を作成します。アンカーを持つ要素は、属性値としてアンカーからの名前を含む id 属性を取得します。エイリアスを持つ要素は、属性値としてアンカーの名前も含む ref 属性を取得します。anchorAttributeName および aliasAttributeName プロパティーを設定すると、アンカーおよびエイリアス属性名を定義できます。
- RESOLVE: リーダーは、エイリアスが検出されると、アンカーの値またはデータ構造を解決します。つまり、アンカーの SAX イベントはエイリアス要素の子イベントとして繰り返されます。YAML ドキュメントに多くのアンカーまたはアンカーと実質的なデータ構造が含まれている場合は、メモリーの問題が発生する可能性があります。
- REFER_RESOLVE: これは、REFER と RESOLVE の組み合わせです。アンカーおよびエイリアス属性が設定されますが、アンカーの値またはデータ構造も解決されます。このオプションはアンカーの名前にビジネス上の意味がある場合に役立ちます。
4.37. Java オブジェクトグラフの変換 リンクのコピーリンクがクリップボードにコピーされました!
- Smooks は、1 つの Java オブジェクトグラフ を別のグラフに変換できます。これを行うには、SAX 処理モデルを使用します。つまり、中間オブジェクトモデルは構成されません。代わりに、ソース Java オブジェクトグラフは、SAX イベントのストリームに直接変換され、ターゲット Java オブジェクトグラフを生成するために使用されます。HTML Smooks Report Generator ツールを使用すると、ソースオブジェクトモデルによって生成されるイベントストリームが次のようになることがわかります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - このイベントストリームで Smooks Java Bean リソースを対象とします。この変換を実行するための Smooks 設定 (smooks-config.xml) は次のとおりです。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - ソースオブジェクトモデルは、
org.milyn.delivery.JavaSourceオブジェクトによって Smooks に提供されます。コンストラクターにソースモデルのルートオブジェクトを渡して、このオブジェクトを作成します。結果としての Java ソースオブジェクトは、Smooks#filterメソッドで使用されます。結果のコードは次のとおりです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.38. 入力データの文字列操作 リンクのコピーリンクがクリップボードにコピーされました!
- upper_case: 文字列の大文字バージョンを返します。
- lower_case: 文字列の小文字バージョンを返します。
- cap_first: 最初の単語を大文字にした文字列を返します。
- uncap_first: 最初の単語を大文字にしていない文字列を返します。これは cap_first の反対です。
- capitalize: すべての単語を大文字にした文字列を返します。
- trim: 先頭と末尾の空白を除いた文字列を返します。
- left_trim: 先頭の空白を除いた文字列を返します。
- right_trim: 末尾の空白を除いた文字列を返します。
trim.upper_case
第5章 検証 リンクのコピーリンクがクリップボードにコピーされました!
5.1. Smooks のルール リンクのコピーリンクがクリップボードにコピーされました!
src、およびルールプロバイダーがあります。
5.2. Smooks でルールを設定する リンクのコピーリンクがクリップボードにコピーされました!
5.3. rules:ruleBase 設定要素の必須設定 リンクのコピーリンクがクリップボードにコピーされました!
- name: これは、このルールを参照するために、他のコンポーネントによって使用されます。
- src: これは、RuleProvider にとって意味のあるファイルまたはその他のものにすることができます。
- provider: これは実際のプロバイダーの実装です。上記の設定では、正規表現を使用する RuleProvider は 1 つですが、複数の ruleBase 要素を指定して、必要な数の RuleProvider を持つことができます。
5.4. ルールプロバイダー リンクのコピーリンクがクリップボードにコピーされました!
org.milyn.rules.RuleProvider インターフェイスを実装します。
- RegexProvider
- MVELProvider
5.5. RegexProvider リンクのコピーリンクがクリップボードにコピーされました!
5.6. Regex ruleBase の設定 リンクのコピーリンクがクリップボードにコピーされました!
- このコード例を使用して、Regex ruleBase を設定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 標準の
.propertiesファイル形式で Regex 表現を定義します。次のcustomer.propertiesRegex ルール定義ファイルの例は、その方法を示しています。# Customer data rules... customerId=[A-Z][0-9]{5} customerName=[A-Z][a-z]*, [A-Z][a-z]# 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 プロバイダー リンクのコピーリンクがクリップボードにコピーされました!
5.8. MVEL ruleBase の設定 リンクのコピーリンクがクリップボードにコピーされました!
- MVEL ruleBase を設定するには、以下のコードを参照してください。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - MVEL ルールを CSV ファイルに保存する必要があります。これらのファイルを編集する最も簡単な方法は、LibreOffice Calc や Gnumeric などのスプレッドシートアプリケーションを使用することです。各ルールレコードには、ルール名と MVEL 式が含まれています。
- コメント行とヘッダー行を作成する場合は、最初のフィールドの前にハッシュ (#) 文字を付けます。
5.9. Smooks 検証カートリッジ リンクのコピーリンクがクリップボードにコピーされました!
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 リンクのコピーリンクがクリップボードにコピーされました!
ValidationResult オブジェクトから OnFailResult インスタンスの形式で取得できます。各インスタンスは、個別の失敗に関する詳細を提供します。
.properties 形式を使用) で定義できます。
i18n という名前のフォルダーを追加すると、ルールソース ("src") から派生します。たとえば、/org/milyn/validation/order/rules/order-rules.csv の MVEL ruleBase ソースがある場合、対応する検証メッセージバンドルのベース名は、/org/milyn/validation/order/rules/i18n/order-rules になります。
5.14. 検証カートリッジとメッセージ リンクのコピーリンクがクリップボードにコピーされました!
ftl: を付け、標準の FreeMarker 表記を使用して、コンテキストデータを参照する必要があります。Bean コンテキストからの Bean は直接参照できますが、ruleResult および path Bean によって RuleEvalResult およびルール失敗パスを参照できます。
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. 検証の種類 リンクのコピーリンクがクリップボードにコピーされました!
.propertiesファイル RuleBase に定義された正規表現を使用したメッセージフィールド値/形式の検証。これは、フィールドが有効な電子メールアドレスであることを検証する場合などに使用できます。.csvファイル RuleBase に定義された MVEL 式を使用したビジネスルールの検証。これは、たとえば、注文の注文品目の合計価格 (価格 * 数量) が事前定義されたビジネスルールに違反していないことを検証できます。
5.16. 検証ルールの実行 リンクのコピーリンクがクリップボードにコピーされました!
- 検証ルールを実行するには、例のルートフォルダーに移動し、次を実行します。
- mvn clean install
- mvn exec:java
5.17. RuleBase の例 リンクのコピーリンクがクリップボードにコピーされました!
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... productId=[0-9]{3}# 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... productId=ftl:Invalid product ID '${ruleResult.text}' at '${path}'. <!-- Product ID must match pattern '${ruleResult.pattern}'. --># 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_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. --># <!-- 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
第6章 出力データの生成 リンクのコピーリンクがクリップボードにコピーされました!
6.1. Smooks Javabean カートリッジ リンクのコピーリンクがクリップボードにコピーされました!
BeanContext クラスによって使用できるようにするためです。このクラスは基本的に、Smooks ExecutionContext によって、Smooks ビジター実装で使用できる Java Bean コンテキスト です。
6.2. Javabean カートリッジの特徴 リンクのコピーリンクがクリップボードにコピーされました!
- テンプレート: これには通常、BeanContext 内のオブジェクトにテンプレートを適用することが含まれます。
- 検証: 通常、ビジネスルールの検証では、BeanContext 内のオブジェクトにルールを適用します。
- メッセージの分割とルーティング: これは、オブジェクト自体を使用して、それらをルーティングするか、テンプレートをそれらに適用して、その操作の結果を新しいファイルにルーティングすることにより、BeanContext 内のオブジェクトから分割メッセージを生成することによって機能します。
- 保持: これらの機能は、データベースにコミットされる Java オブジェクト (エンティティーなど) を作成および投入するための Java バインド機能に依存します。データベースから読み取られたデータは、通常、BeanContext にバインドされます。
- メッセージのエンリッチ: エンリッチデータ (データベースなどから読み取られる) は通常 BeanContext にバインドされ、そこから Java バインド機能自体を含む Smooks の他のすべての機能で使用できます (式ベースのバインド に使用できるようにします)。 これにより、Smooks によって生成されたメッセージをエンリッチできます。
6.3. Javabean カートリッジの例 リンクのコピーリンクがクリップボードにコピーされました!
example.model.Order クラスのインスタンスを作成し、order という BeanId の下の Bean コンテキストにバインドします。インスタンスは #document 要素のメッセージの最初 (つまり、root order 要素の最初) に作成されます。
example.model.Order Bean インスタンスを作成し、Bean コンテキストにバインドします。
6.4. Javabean 要素 リンクのコピーリンクがクリップボードにコピーされました!
- beanId: これは Bean の識別子です。
- class: これは Bean の
完全修飾クラス名です。 - createOnElement: この属性を使用して、Bean インスタンスをいつ作成するかを制御します。バインド設定 (
jb:bean要素の子要素) を使用して、Bean プロパティーの設定を制御できます。 - createOnElementNS: この属性によって createOnElement の namespace を指定できます。
6.5. Javabean 条件 リンクのコピーリンクがクリップボードにコピーされました!
- 引数なしのパブリックコンストラクターがあります。
- パブリックプロパティーセッターメソッド があります。これらは、特定の名前形式に従う必要はありませんが、標準のプロパティーセッターメソッド名の形式に従う方がよいでしょう。
- Java Bean プロパティーを直接設定することはできません。
6.6. Javabean カートリッジのデータバインド リンクのコピーリンクがクリップボードにコピーされました!
- jb:value: これを使用して、ソースメッセージイベントストリームからターゲット Bean にデータ値をバインドします。
- jb:wiring: これを使用して、別の Bean インスタンスを Bean コンテキストからターゲット Bean の Bean プロパティーに接続します。この設定を使用して、オブジェクトグラフ を作成できます (Java オブジェクトインスタンスの緩やかなコレクションとは対照的)。beanId、Java クラスタイプ、またはアノテーションに基づいて、Bean をプラグインできます。
- jb:expression: この設定を使用して、(MVEL 言語で) 式から計算された値をバインドします。簡単な例として、注文品目の合計値を OrderItem Bean にバインドする機能があります (価格 * 数量を計算する式の結果に基づく)。execOnElement 属性式を使用して、式が評価され、結果が結合される要素を定義します。(定義しない場合、式は、親 jb:bean createOnElement の値に基づいて、実行されます。) 対象の要素の値は、
_VALUEという名前の文字列変数として式で使用できます (アンダースコアに注意してください)。
6.7. データのバインド リンクのコピーリンクがクリップボードにコピーされました!
- Order XML メッセージを使用して、完全な XML to Java バインド設定を確認します。その XML メッセージから入力する必要がある Java オブジェクトは次のとおりです (ゲッターとセッターは示されていません)。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - この設定を使用して、注文 XML からオブジェクトモデルにデータをバインドします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.8. データ設定のバインド リンクのコピーリンクがクリップボードにコピーされました!
- メッセージの最初 (order 要素上) で各 Bean インスタンス ((1)、(2)、(3) であり、(4) ではない) を作成する必要があります。これを行うのは、データが取り込まれたモデルにこれらの Bean のインスタンスが 1 つしか存在しないためです。
- 設定 (1.a) と (1.b) は、Header および ListOrderItem Bean インスタンス ((2) と (3)) を注文 Bean インスタンスに接続するための接続設定を定義します (beanIdRef 属性値、および (2) と (3) で定義された beanId 値の参照方法を参照)。(1.a) と (1.b) のプロパティー属性は接続が実行される注文 Bean プロパティーを定義します。Bean は、Java クラスタイプ (beanType) に基づいて、または特定のアノテーション (beanAnnotation) でアノテーションを付けて、オブジェクトに接続することもできます。設定 (2) は、com.acme.Header Bean インスタンスを作成します。
- 設定 (2.a) は、Header.date プロパティーへの値バインドを定義します。data 属性は、バインド値がソースメッセージから選択される場所を定義することに注意してください。この場合は、ヘッダー/日付要素から来ています。また、decodeParam サブ要素を定義する方法に注意してください。これにより、DateDecoder が設定されます。
- 設定 (2.b) は、値バインド設定を Header.customerNumber プロパティーに定義します。ソースメッセージの要素属性からバインド値を選択するように、データ属性を設定する方法に注意してください。設定 (2.b) は、注文合計が計算され、Header.total プロパティーに設定される式バインドも定義します。execOnElement 属性は、この式を注文品目要素で評価 (およびバインド/再バインド) する必要があることを Smooks に指示します。そのため、ソースメッセージに複数の注文品目要素がある場合、この式は注文品目ごとに実行され、新しい合計値が Header.total プロパティーに再バインドされます。式が現在の orderItem 合計を現在の注文合計 (Header.total) に追加する方法に注意してください。
- 設定 (2.d) は、現在の合計に注文品目ごとの合計 (数量 * 価格) を加算することによって、実行中の合計が計算される式バインドを定義します。設定 (3) は、OrderItem インスタンスを保持するための ListOrderItem Bean インスタンスを作成します。
- 設定 (3.a) は、タイプ com.acme.OrderItem (つまり、(4)) のすべての Bean をリストに接続します。この接続がプロパティー属性を定義していないことに注意してください。これは、コレクションに接続しているためです (配列に接続する場合も同様です)。beanType 属性の代わりに beanIdRef 属性を使用して、この接続を実行することもできます。
- 設定 (4) は、OrderItem Bean インスタンスを作成します。createOnElement が注文品目要素に設定されていることに注意してください。これにより、この Bean の新しいインスタンスを注文品目要素ごとに作成できます (また、ListOrderItem (3.a) に接続できます)。
6.9. バインドのヒント リンクのコピーリンクがクリップボードにコピーされました!
- モデル内にインスタンスが 1 つだけ存在する Bean インスタンスのルート要素 (または
#document) に jb:bean createOnElement を設定します。コレクション Bean インスタンス の繰り返し要素に設定します。警告この場合は、正しい要素を指定しないと、データが失われる可能性があります。 - jb:value デコーダー: ほとんどの場合、Smooks は jb:value バインドに使用されるデータ型デコーダーを自動的に検出します。ただし、一部のデコーダーでは、設定が必要です (一例として、DateDecoder [
decoder="Date"])。このような場合は、バインドでデコーダー属性 (およびそのデコーダーのデコードパラメーターを指定するための jb:decodeParam 子要素) を定義する必要があります。 - コレクションにバインドする場合、jb:wiring プロパティーは必要ありません。
- 必要なコレクションタイプを設定するには、jb:bean クラスを定義し、コレクションエントリーに接続します。配列の場合は、jb:bean クラス属性値を角かっこで 後置 するだけです (例:
class=&"com.acme.OrderItem[]")。
6.10. DataDecoder/DataEncoder 実装 リンクのコピーリンクがクリップボードにコピーされました!
- Date: 文字列を java.util.Date インスタンスにデコード/エンコードします。
- Calendar: 文字列を java.util.Calendar インスタンスにデコード/エンコードします。
- SqlDate: 文字列を java.sql.Date インスタンスにデコード/エンコードします。
- SqlTime: 文字列を java.sql.Time インスタンスにデコード/エンコードします。
- SqlTimestamp: 文字列を java.sql.Timestamp インスタンスにデコード/エンコードします。
6.11. DataDecoder/DataEncoder 日付の例 リンクのコピーリンクがクリップボードにコピーされました!
<jb:value property="date" decoder="Date" data="order/@date">
<jb:decodeParam name="format">EEE MMM dd HH:mm:ss z yyyy</jb:decodeParam>
<jb:decodeParam name="locale">sv_SE</jb:decodeParam>
</jb:value>
<jb:value property="date" decoder="Date" data="order/@date">
<jb:decodeParam name="format">EEE MMM dd HH:mm:ss z yyyy</jb:decodeParam>
<jb:decodeParam name="locale">sv_SE</jb:decodeParam>
</jb:value>
6.12. DataDecoder/DataEncoder SqlTimestamp の例 リンクのコピーリンクがクリップボードにコピーされました!
<jb:value property="date" decoder="SqlTimestamp" data="order/@date">
<jb:decodeParam name="format">EEE MMM dd HH:mm:ss z yyyy</jb:decodeParam>
<jb:decodeParam name="locale">sv</jb:decodeParam>
</jb:value>
<jb:value property="date" decoder="SqlTimestamp" data="order/@date">
<jb:decodeParam name="format">EEE MMM dd HH:mm:ss z yyyy</jb:decodeParam>
<jb:decodeParam name="locale">sv</jb:decodeParam>
</jb:value>
6.13. DataDecoder/DataEncoder decodeParam の例 リンクのコピーリンクがクリップボードにコピーされました!
<jb:value property="date" decoder="Date" data="order/@date">
<jb:decodeParam name="format">EEE MMM dd HH:mm:ss z yyyy</jb:decodeParam>
<jb:decodeParam name="locale-language">sv</jb:decodeParam>
<jb:decodeParam name="locale-country">SE</jb:decodeParam>
</jb:value>
<jb:value property="date" decoder="Date" data="order/@date">
<jb:decodeParam name="format">EEE MMM dd HH:mm:ss z yyyy</jb:decodeParam>
<jb:decodeParam name="locale-language">sv</jb:decodeParam>
<jb:decodeParam name="locale-country">SE</jb:decodeParam>
</jb:value>
6.14. 数値ベースの DataDecoder/DataEncoder 実装 リンクのコピーリンクがクリップボードにコピーされました!
- BigDecimalDecoder: これを使用して、文字列を java.math にデコード/エンコードします。BigDecimal インスタンス。
- BigIntegerDecoder: これを使用して、文字列を java.math にデコード/エンコードします。BigInteger インスタンス。
- DoubleDecoder: これを使用して、文字列を java.lang.Double インスタンス (プリミティブを含む) にデコード/エンコードします。
- FloatDecoder: これを使用して、文字列を java.lang.Float インスタンス (プリミティブを含む) にデコード/エンコードします。
- IntegerDecoder: これを使用して、文字列を java.lang.Integer インスタンス (プリミティブを含む) にデコード/エンコードします。
- LongDecoder: これを使用して、文字列を java.lang.Long インスタンス (プリミティブを含む) にデコード/エンコードします。
- ShortDecoder: これを使用して、文字列を java.lang.Short インスタンス (プリミティブを含む) にデコード/エンコードします。
6.15. 数値ベースの DataDecoder/DataEncoder の例 リンクのコピーリンクがクリップボードにコピーされました!
<jb:value property="price" decoder="BigDecimal" data="orderItem/price">
<jb:decodeParam name="format">#,###.##</jb:decodeParam>
<jb:decodeParam name="locale">en_IE</jb:decodeParam>
</jb:value>
<jb:value property="price" decoder="BigDecimal" data="orderItem/price">
<jb:decodeParam name="format">#,###.##</jb:decodeParam>
<jb:decodeParam name="locale">en_IE</jb:decodeParam>
</jb:value>
6.16. 数値ベースの DataDecoder/DataEncoder 整数の例 リンクのコピーリンクがクリップボードにコピーされました!
<jb:value property="percentage" decoder="Integer" data="vote/percentage">
<jb:decodeParam name="format">#%</jb:decodeParam>
</jb:value>
<jb:value property="percentage" decoder="Integer" data="vote/percentage">
<jb:decodeParam name="format">#%</jb:decodeParam>
</jb:value>
6.17. 数値ベースの DataDecoder/DataEncoder decodeParam の例 リンクのコピーリンクがクリップボードにコピーされました!
6.18. マッピングデコーダーをバインドに使用する リンクのコピーリンクがクリップボードにコピーされました!
- 次のように、入力メッセージのデータに基づいて、異なる値をオブジェクトモデルにバインドするように、マッピングデコーダーを設定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 入力データ値 1 は、name プロパティに値 Dublin としてマッピングされます。値 2 と 3 についても同様です。
6.19. 列挙型デコーダー リンクのコピーリンクがクリップボードにコピーされました!
6.20. 列挙型デコーダーの例 リンクのコピーリンクがクリップボードにコピーされました!
- 次の例では、入力メッセージのヘッダー/優先度フィールドに、
LOW、MEDIUM、およびHIGHの値が含まれています。これらを、それぞれNOT_IMPORTANT、IMPORTANT、およびVERY_IMPORTANTの LineOrderPriority 列挙型の値にマッピングする必要があります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - マッピングが必要な場合は、enumType decodeParam を使用して、列挙型を指定します。
6.21. BeanContext 設定 リンクのコピーリンクがクリップボードにコピーされました!
6.22. Javabean カートリッジのアクション リンクのコピーリンクがクリップボードにコピーされました!
- ソース/入力メッセージストリームから文字列値を抽出します。
decoderおよびdecodeParam設定に基づいて、文字列値をデコードします (これらが定義されていない場合は、デコーダーを反射的に解決しようとします)。- ターゲット Bean にデコードされた値を設定します。
6.23. 文字列データの前処理 リンクのコピーリンクがクリップボードにコピーされました!
6.24. 前処理の例 リンクのコピーリンクがクリップボードにコピーされました!
<!-- A direct value binding example: -->
<jb:value beanId="price" data="price" decoder="BigDecimal">
<jb:decodeParam name="valuePreprocess">value.replace("_", "").replace("!", ".")</jb:decodeParam>
</jb:value>
<!-- A direct value binding example: -->
<jb:value beanId="price" data="price" decoder="BigDecimal">
<jb:decodeParam name="valuePreprocess">value.replace("_", "").replace("!", ".")</jb:decodeParam>
</jb:value>
6.25. Javabean カートリッジとファクトリー リンクのコピーリンクがクリップボードにコピーされました!
some.package.FactoryClass#staticMethod{.instanceMethod}
some.package.FactoryClass#staticMethod{.instanceMethod}
6.26. 静的ファクトリーメソッドを使用して、ArrayList オブジェクトをインスタンス化する リンクのコピーリンクがクリップボードにコピーされました!
- 次の例に従って、静的ファクトリーメソッドを使用して、ArrayList オブジェクトをインスタンス化します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow some.package.ListFactory#newListファクトリー定義は、Bean を作成するために、some.package.ListFactoryクラスでnewListメソッドを呼び出す必要があります。クラス属性は、Bean を List オブジェクトとして定義します。List オブジェクトの特定の種類 (ArrayList か LinkedList か) は、ListFactory 自体によって決定されます。 - 次の追加の例を確認してください。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow これは、静的メソッドgetInstanceを使用して、ListFactory のインスタンスを取得する必要があること、および ListFactory オブジェクト上でメソッドnewListを呼び出して、List オブジェクトを作成する必要があることを定義しています。この構成では、シングルトンファクトリー を使用できます。
6.27. 定義言語の宣言 リンクのコピーリンクがクリップボードにコピーされました!
- 各定義言語には、エイリアスを設定できます。たとえば、MVEL には、エイリアス mvel があります。特定のファクトリー定義に MVEL を使用することを定義するには、定義の前に mvel: を置きます。たとえば、mvel:some.package.ListFactory.getInstance().newList() です。デフォルトの基本言語のエイリアスは basic です。
- 言語をグローバルデフォルトとして設定するには、factory.definition.parser.class グローバルパラメーターを、使用する言語の FactoryDefinitionParser インターフェイスを実装するクラスの完全なクラスパスに設定する必要があります。
:を含むデフォルト言語による定義がある場合は、例外を回避するために、その定義の前にdefault:を付ける必要があります。 - 使用する言語の FactoryDefinitionParser インターフェイスを実装するクラスの完全なクラスパスを設定できます。(例: org.milyn.javabean.factory.MVELFactoryDefinitionParser:some.package.ListFactory.getInstance().newList()) 通常、これはテスト目的のみに使用してください。言語のエイリアスを定義する方がはるかに優れています。
6.28. 独自の定義言語の使用 リンクのコピーリンクがクリップボードにコピーされました!
- 独自の言語を定義するには、org.milyn.javabean.factory.FactoryDefinitionParser インターフェイスを実装します。org.milyn.javabean.factory.MVELFactoryDefinitionParser または org.milyn.javabean.factory.BasicFactoryDefinitionParser の例を確認してください。
- 定義言語のエイリアスを定義するには、エイリアス名を持つ org.milyn.javabean.factory.Alias アノテーションを FactoryDefinitionParser クラスに追加します。
- Smooks がエイリアスを見つけるには、クラスパスのルートに META-INF/smooks-javabean-factory-definition-parsers.inf ファイルを作成する必要があります。T
6.29. MVEL 言語 リンクのコピーリンクがクリップボードにコピーされました!
mvel を使用するか、factory.definition.parser.class グローバルパラメーターを org.milyn.javabean.factory.MVELFactoryDefinitionParser に設定します。
6.30. MVEL の例 リンクのコピーリンクがクリップボードにコピーされました!
6.31. MVEL を使用したリストオブジェクトの抽出 リンクのコピーリンクがクリップボードにコピーされました!
6.32. jb:value プロパティー リンクのコピーリンクがクリップボードにコピーされました!
6.33. jb:value プロパティーの例 リンクのコピーリンクがクリップボードにコピーされました!
<jb:bean BeanId="keyValuePairs" class="java.util.HashMap" createOnElement="root">
<jb:value property="@name" data="root/property" />
</jb:bean>
<jb:bean BeanId="keyValuePairs" class="java.util.HashMap" createOnElement="root">
<jb:value property="@name" data="root/property" />
</jb:bean>
6.34. 仮想オブジェクトモデル リンクのコピーリンクがクリップボードにコピーされました!
6.35. 仮想オブジェクトモデルの例 リンクのコピーリンクがクリップボードにコピーされました!
6.36. 複数のデータエンティティーを 1 つのバインドにマージする リンクのコピーリンクがクリップボードにコピーされました!
jb:expression) を使用すると、複数のデータエンティティーを 1 つのバインドにマージできます。Javabean カートリッジは、Smooks DataDecoder を使用して、選択したデータ要素/属性からオブジェクトを作成します。次に、Bean コンテキストに直接追加します。
6.37. 値バインド リンクのコピーリンクがクリップボードにコピーされました!
6.38. 値バインドの属性 リンクのコピーリンクがクリップボードにコピーされました!
- beanId: 作成されたオブジェクトが Bean コンテキストでバインドされる ID。
- data: バインドするデータ値のデータセレクター。(例:
order/orderidまたはorder/header/@date - dataNS: データセレクターの namespace
- デコーダー: 値を String から別の型に変換するための DataDecoder 名。DataDecoder は、decodeParam 要素で設定できます。
- default: 選択したデータが null または空の文字列の場合のデフォルト値。
6.39. 値バインドの例 リンクのコピーリンクがクリップボードにコピーされました!
6.40. プログラムによる値バインドの例 リンクのコピーリンクがクリップボードにコピーされました!
6.41. Smooks での Java バインド リンクのコピーリンクがクリップボードにコピーされました!
6.42. Java バインドの例 リンクのコピーリンクがクリップボードにコピーされました!
JavaResult result = new JavaResult();
smooks.filterSource(new StreamSource(orderMessageStream), result);
Order order = (Order) result.getBean("order");
JavaResult result = new JavaResult();
smooks.filterSource(new StreamSource(orderMessageStream), result);
Order order = (Order) result.getBean("order");
6.43. org.milyn.javabean.gen.ConfigGenerator ユーティリティークラス リンクのコピーリンクがクリップボードにコピーされました!
6.44. org.milyn.javabean.gen.ConfigGenerator の例 リンクのコピーリンクがクリップボードにコピーされました!
$JAVA_HOME/bin/java -classpath <classpath> org.milyn.javabean.gen.ConfigGenerator -c <rootBeanClass> -o <outputFilePath> [-p <propertiesFilePath>]
$JAVA_HOME/bin/java -classpath <classpath> org.milyn.javabean.gen.ConfigGenerator -c <rootBeanClass> -o <outputFilePath> [-p <propertiesFilePath>]
-cコマンドライン引数は、バインド設定が生成されるモデルのルートクラスを指定します。-oコマンドライン引数は、生成された設定出力のパスとファイル名を指定します。-pコマンドライン引数は、追加のバインドパラメーターを指定するオプションのバインド設定ファイルのパスとファイル名を指定します。- オプションの
-pプロパティーファイルパラメーターを使用すると、追加の設定パラメーターを指定できます。 - packages.included: セミコロンで区切られたパッケージのリスト。これらのパッケージに一致するクラス内のすべてのフィールドは、生成されたバインド設定に含まれます。
- packages.excluded: セミコロンで区切られたパッケージのリスト。これらのパッケージに一致するクラス内のすべてのフィールドは、生成されたバインド設定から除外されます。
6.45. バインド設定のプログラミング リンクのコピーリンクがクリップボードにコピーされました!
- jb:bean 要素ごとに、Bean インスタンスの作成に使用するイベント要素に createOnElement 属性を設定します。
- jb:value データ属性を更新して、その BFean プロパティーのバインドデータを提供するイベント要素/属性を選択します。
- jb:value デコーダーの属性を確認してください。実際のプロパティータイプによっては、すべてが設定されるわけではありません。これらは手動で設定する必要があります。日付フィールドなど、一部のバインドでデコーダーの jb:decodeParam サブ要素を設定する必要がある場合があります。
- バインド設定要素 (jb:value および jb:wiring) を再確認し、生成された設定ですべての Java プロパティーがカバーされていることを確認します。
6.46. 変換の設定 リンクのコピーリンクがクリップボードにコピーされました!
- セレクターの値を決定する際、HTML レポートツールにアクセスします。これは、Smooks から見た (セレクターが適用される) 入力メッセージモデルを視覚化するために役立ちます。
- ソースデータを使用して、レポートを生成しますが、変換設定は空です。レポートでは、設定を追加する必要があるモデルを確認できます。設定を 1 つずつ追加し、レポートを再実行して、設定が適用されていることを確認します。
- 設定を 1 つずつ追加し、レポートを再実行して、設定が適用されていることを確認します。
- その結果、次のような設定が生成されます (
$TODO$トークンに注意してください)。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記Smooks.filterSource メソッドを呼び出した後の JavaResult インスタンスの正確な内容に関する保証はありません。このメソッドを呼び出した後、JavaResult インスタンスには、任意のビジター実装によって追加できる Bean コンテキストの最終的な内容が含まれます。
6.47. jb:result の設定例 リンクのコピーリンクがクリップボードにコピーされました!
order Bean のみを保持するように、Smooks に指示します。
order Bean の結果に対する JavaResult.getBean (String) メソッドの呼び出しは、null を返します。これは、他の Bean インスタンスが order グラフに接続しているため、上記の例のような場合に機能します。
第7章 テンプレート リンクのコピーリンクがクリップボードにコピーされました!
7.1. Smooks テンプレート リンクのコピーリンクがクリップボードにコピーされました!
- フラグメント ごとにソースメッセージに適用できます。これは、メッセージ全体に適用されるフラグメントベースの変換プロセスとは対照的です。フラグメントごとに適用すると、SOAP メッセージにヘッダーを追加する場合など、非常に特定のポイントでメッセージにデータを挿入する必要がある場合に役立ちます。この場合、プロセスは、残りの部分を中断せずに、関心のあるフラグメントを対象とすることができます。
- Javabean Cartridge などの他の Smooks テクノロジーを利用できます。これは、Bean コンテキストへのメッセージデータのデコードおよびバインドに使用できます。次に、FreeMarker テンプレート内から、そのデコードされたデータを参照できます。(Smooks はデータを FreeMarker で使用できるようにします。)
- 巨大なメッセージストリーム (数ギガバイトのサイズ) を処理するために使用できます。同時に、単純な処理モデルと小さなメモリーフットプリントを維持します。
- 分割メッセージフラグメント を生成するために使用できます。これらは、Enterprise Service Bus 上の物理的または論理的なエンドポイントにルーティングできます。
7.2. FreeMarker テンプレート リンクのコピーリンクがクリップボードにコピーされました!
7.3. FreeMarker テンプレートの例 リンクのコピーリンクがクリップボードにコピーされました!
- インラインテンプレートの例:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - FreeMarker 外部テンプレートの例:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Smooks が結果の出力にさまざまな操作を実行できるように、<ftl:freemarker> 設定に <use> 要素 を追加します。以下の例を参照してください。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.4. Smooks でのインライン リンクのコピーリンクがクリップボードにコピーされました!
Smooks.filterSource の結果にインラインできます。多くのディレクティブがサポートされています。
- addto: これにより、テンプレート結果が対象の要素に追加されます。
- replace (デフォルト): テンプレート結果を使用して、対象の要素を置換します。これは、<use> 要素が設定されていない場合の <ftl:freemarker> 設定のデフォルトの動作です。
- insertbefore: これにより、テンプレート結果が対象の要素の前に追加されます。
- insertafter: これにより、テンプレート結果が対象の要素の後に追加されます。
7.5. ftl:bindTo 要素 リンクのコピーリンクがクリップボードにコピーされました!
7.6. ftl:bindTo の例 リンクのコピーリンクがクリップボードにコピーされました!
7.7. ftl:outputTo 要素 リンクのコピーリンクがクリップボードにコピーされました!
OutputStreamResource クラスに書き込むことができます。これは、巨大なメッセージを小さなメッセージに分割するためのもう 1 つの役立つ機能です。
7.8. ftl:outputTo の例 リンクのコピーリンクがクリップボードにコピーされました!
OutputStreamSource に書き込む例:
7.9. 変換の設定 リンクのコピーリンクがクリップボードにコピーされました!
- セレクターの値を決定する際、HTML レポートツールにアクセスします。これは、Smooks から見た (セレクターが適用される) 入力メッセージモデルを視覚化するために役立ちます。
- ソースデータを使用して、レポートを生成しますが、変換設定は空です。レポートでは、設定を追加する必要があるモデルを確認できます。設定を 1 つずつ追加し、レポートを再実行して、設定が適用されていることを確認します。
- 設定を 1 つずつ追加し、レポートを再実行して、設定が適用されていることを確認します。
- その結果、次のような設定が生成されます (
$TODO$トークンに注意してください)。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記Smooks.filterSource メソッドを呼び出した後の JavaResult インスタンスの正確な内容に関する保証はありません。このメソッドを呼び出した後、JavaResult インスタンスには、任意のビジター実装によって追加できる Bean コンテキストの最終的な内容が含まれます。
7.10. FreeMarker と Java Bean カートリッジ リンクのコピーリンクがクリップボードにコピーされました!
NodeModel は、強力で使いやすいですが、パフォーマンスの点でトレードオフがあります。W3C DOM の構成は低コストではありません。また、必要なデータがすでに抽出され、Java オブジェクトモデルに投入されている場合があります。たとえば、データを一連のオブジェクトとして Java Message Service エンドポイントにルーティングする必要がある場合などです。
NodeModel の使用が実用的でない場合は、Java Bean カートリッジを使用して、適切な Java オブジェクトまたは仮想モデルを設定します。このモデルは、FreeMarker テンプレートプロセスで使用できます。
7.11. NodeModel の例 リンクのコピーリンクがクリップボードにコピーされました!
7.12. プログラムによる設定 リンクのコピーリンクがクリップボードにコピーされました!
FreeMarkerTemplateProcessor インスタンスを追加および設定します。この例では、Java バインドと FreeMarker テンプレートの設定を Smooks に追加します。
7.13. XSL テンプレート リンクのコピーリンクがクリップボードにコピーされました!
- Smooks で XSL テンプレートを使用するには、統合開発環境で http://www.milyn.org/xsd/smooks/xsl-1.1.xsd XSD を設定してください。重要JBoss SOA では、ルートフラグメントに適用される 1 つの XSLT のみが Smooks 設定に含まれている場合、フラグメントフィルターはバイパスされます。XSLT は直接適用されます。これは、パフォーマンス上の理由で行われ、
enableFilterBypassというパラメーターを追加し、falseに設定すると、無効にすることができます。<param name="enableFilterBypass">false</param>
<param name="enableFilterBypass">false</param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.14. XSL の例 リンクのコピーリンクがクリップボードにコピーされました!
7.15. XSL サポートの注意点 リンクのコピーリンクがクリップボードにコピーされました!
- メッセージ全体の変換ではなく、フラグメント変換を実行する必要があります。
- 分割、保持など、メッセージに追加の操作を行うには、他の Smooks 機能を使用する必要があります。
- XSL テンプレートは、DOM フィルターのみによってサポートされます。SAX フィルターではサポートされていません。これにより、(適用される XSL によっては) XSL の SAX ベースのアプリケーションと比較して、パフォーマンスが低下する可能性があります。
- Smooks は、メッセージフラグメントごとに XSL テンプレートを適用します。これは XSL のフラグメント化に非常に役立ちますが、スタンドアロンコンテキスト用に記述されたテンプレートが、変更なく、Smooks で自動的に機能するとは想定しないでください。このため、Smooks は、テンプレートを (ルート DOM 要素ではなく) DOM ドキュメントノードに適用するという点で、ドキュメントルートノードを対象とする XSL を異なる方法で処理します。
- ほとんどの XSL には、ルート要素に一致するテンプレートが含まれています。Smooks はフラグメントごとに XSL を適用するため、これはもはや有効ではありません。代わりに、コンテキストノード (つまり、対象のフラグメント) に一致するテンプレートがスタイルシートに含まれていることを確認してください。
7.16. 潜在的な問題: XSLT は、外部では機能するが、Smooks 内では機能しない リンクのコピーリンクがクリップボードにコピーされました!
- ドキュメントルートノードへの絶対パス参照を使用するテンプレートがスタイルシートに含まれている場合は、Smooks フラグメントベースの処理モデルで問題が発生します。これは、Smooks が誤った要素を対象としているためです。この問題を解決するには、Smooks が対象としているコンテキストノードに一致するテンプレートが XSLT に含まれていることを確認してください。
- SAX と DOM の処理の比較: 「いいね」と「いいね」が比較されているわけではありません。現状では、Smooks は XSL を処理するための DOM ベースの処理モデルのみをサポートしています。正確な比較を行うには、Smooks 外で XSL テンプレートを実行する際、DOMSource (namespace を認識するもの) を使用します。(特定の XSL プロセッサーが、SAX または DOM を使用して、XSL テンプレートを適用しようとしても、常に同じ出力を生成するとはかぎりません。)
第8章 出力データのエンリッチ リンクのコピーリンクがクリップボードにコピーされました!
8.1. すぐに使えるエンリッチ方法 リンクのコピーリンクがクリップボードにコピーされました!
- JDBC データソース
- JDBC データソースを使用して、データベースにアクセスし、SQL ステートメントを使用して、データベースの読み取りと書き込みを行います。この機能は、Smooks Routing Cartridge によって提供されます。SQL を使用したデータベースへのルーティングに関するセクションを参照してください。
- エンティティーの保持
- エンティティー保持フレームワーク (Ibatis、Hibernate、または任意の JPA 互換フレームワークなど) を使用して、データベースにアクセスし、そのクエリー言語または CRUD メソッドを使用して、データベースの読み取りまたは書き込みを行います。
- DAO
- カスタムデータアクセスオブジェクト (DAO) を使用して、データベースにアクセスし、その CRUD メソッドを使用して、データベースの読み取りまたは書き込みを行います。
8.2. ハイバネーションの例 リンクのコピーリンクがクリップボードにコピーされました!
8.3. Hibernate エンティティー リンクのコピーリンクがクリップボードにコピーされました!
8.4. 注文の処理と保持 リンクのコピーリンクがクリップボードにコピーされました!
- XML 注文メッセージを処理および保持するには、注文データを Order エンティティー (Order、OrderLine、および Product) にバインドする必要があります。これを行うには、Java Binding フレームワークを使用して、Order エンティティーと OrderLine エンティティーを作成および投入します。
- 各 OrderLine インスタンスを Order インスタンスに接続します。
- 各 OrderLine インスタンスで、関連する注文明細の Product エンティティーを検索および接続する必要があります。
- 最後に、下記のように、Order インスタンスを挿入 (保持) します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - クエリー文字列の代わりに名前付きクエリー
productByIdを使用する場合、DAO ロケーターの設定は次のようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.5. SessionRegister オブジェクトによる Smooks の実行 リンクのコピーリンクがクリップボードにコピーされました!
SessionRegister オブジェクトが使用されます。
8.6. DAO による注文の保持 リンクのコピーリンクがクリップボードにコピーされました!
- DAO で注文を保持するには、以下のコード例を確認してください。この例では、注文情報を含む XML ファイルを読み取ります (これは、EDI、CSV などでも同様に機能します)。Javabean カートリッジを使用して、XML データを一連のエンティティー Bean にバインドします。製品エンティティーを検索し、注文品目 (製品要素) 内の製品の ID を使用して、注文エンティティー Bean にバインドします。最後に、注文 Bean が保持されます。注文 XML メッセージは次のようになります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Order エンティティーを保持するには、次の例のようなカスタム DAO を使用します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このクラスを見ると、@Dao および @Insert アノテーションに気付くはずです。@Dao アノテーションは、OrderDao が DAO オブジェクトであることを宣言します。@Insert アノテーションは、insertOrder メソッドを使用して、Order エンティティーを挿入する必要があることを宣言します。 - 次の例のように、カスタム DAO を使用して、Product エンティティーを検索します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このクラスを見ると、@Lookup および @Param アノテーションに気付くはずです。@Lookup アノテーションは、ProductDao#findByProductId メソッドを使用して、Product エンティティーを検索することを宣言します。@Lookup アノテーションの name パラメーターは、そのメソッドのルックアップ名参照を設定します。名前が宣言されていない場合は、メソッド名が使用されます。オプションの @Param アノテーションを使用すると、パラメーターに名前を付けることができます。これにより、Smooks と DAO の間の抽象化が向上します。@Param アノテーションを宣言しない場合、パラメーターはその位置によって解決されます。 - 上記のように注文を設定すると、結果の Smooks 設定は次のようになります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のコードを使用して、Smooks を実行します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第9章 Groovy スクリプト リンクのコピーリンクがクリップボードにコピーされました!
9.1. Groovy リンクのコピーリンクがクリップボードにコピーされました!
9.2. Groovy の例 リンクのコピーリンクがクリップボードにコピーされました!
9.3. Groovy のヒント リンクのコピーリンクがクリップボードにコピーされました!
- ビジットされた要素 は、適切な名前の変数によってスクリプトで使用できます。element(要素名と同じ変数名でも使用できますが、後者の名前が英数字に制限されている場合に限ります。)
- 前に実行/後に実行: デフォルトでは、visitAfter イベントの発生時、スクリプトが実行されます。executeBefore 属性を
trueに設定して、visitBefore で実行するように、指示します。 - コメント/CDATA スクリプトラップ: スクリプトに特殊な XML 文字が含まれている場合は、スクリプトを
XML CommentまたはCDATAセクションでラップできます。
9.4. Imports リンクのコピーリンクがクリップボードにコピーされました!
org.milyn.xml.DomUtilsorg.milyn.javabean.context.BeanContext.Smooks 1.3 以降のみ。org.milyn.javabean.repository.BeanRepositoryorg.w3c.dom.*groovy.xml.dom.DOMCategorygroovy.xml.dom.DOMUtilgroovy.xml.DOMBuilder
9.5. Groovy で DOM と SAX の混合を使用する リンクのコピーリンクがクリップボードにコピーされました!
9.6. DOM と SAX の混合のヒント リンクのコピーリンクがクリップボードにコピーされました!
- デフォルトモードのみで使用できます (つまり、executeBefore が
falseに等しい場合)。executeBefore がtrueであるように設定されている場合、この機能は、利用できません。つまり、Groovy スクリプトは、SAXElement のみにアクセスできます。 - writeFragment は、DOM フラグメントを
Smooks.filterSource StreamResultに書き込むために、呼び出す必要があります。 - この DOM 構成機能を使用すると、パフォーマンスのオーバーヘッドが発生します。(巨大なメッセージを処理することはできますが、少し時間がかかる場合があります。妥協点は使いやすさとパフォーマンスの間です。)
9.7. DOM と SAX の混合の例 リンクのコピーリンクがクリップボードにコピーされました!
手順9.1 タスク
- 次のサンプルのような XML メッセージを考えてみましょう。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 上記の買い物リストの消耗品カテゴリーを変更するには、さらに 2 つのペンを追加します。これを行うには、単純な Groovy スクリプトを記述し、メッセージの <category> 要素を対象とします。
- その結果、スクリプトは単純にカテゴリー内の <item> 要素を反復し、カテゴリータイプが「消耗品」で品目が「ペン」の場合、数量は 2 つ増加します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第10章 出力データのルーティング リンクのコピーリンクがクリップボードにコピーされました!
10.1. 出力データオプション リンクのコピーリンクがクリップボードにコピーされました!
Basic Fragment Splitting: メッセージにダム分割を実行する必要がある場合があります。つまり、メッセージ内のすべての注文品目フラグメントを分割し、ファイルにルーティングします。ダム分割とは、ルーティング前にメッセージ階層の他の部分からのデータをマージするなど、ルーティング前に、分割メッセージフラグメントにどのような変換も実行する必要がないことを意味します。(たとえば、ルーティングの前に注文品目フラグメントに顧客の詳細情報を追加します。)基本的な分割とルーティングでは、分割するメッセージフラグメントの XPath を定義し、未変更の分割メッセージフラグメントをルーティングするルーティングコンポーネント (JBoss ESB や Camel など) を定義するだけです。複雑なフラグメント分割: 基本的なフラグメント分割は、多くのユースケースで機能し、ほとんどの分割およびルーティングソリューションが提供するものです。Smooks は、ルーティングが適用される前に、分割フラグメントデータに変換を実行できるようにして、基本的な分割機能を拡張します。たとえば、顧客詳細の注文情報を各注文品目情報とマージしてから、ルーティング注文品目分割フラグメントルーティングを実行します。In Stream Splitting and Routing(巨大なメッセージのサポート): Smooks はストリーム内でルーティングを実行できるため (完全なメッセージを処理した後、ルーティング用にまとめることはできません)、ギガバイト単位のサイズの巨大なメッセージストリームの処理に対応できます。Multiple Splitting and Routing: 入力メッセージストリームの 1 つのフィルタリングパスで複数のメッセージフラグメント (さまざまな形式の XML、EDI、Java など) を条件付きで分割し、さまざまなエンドポイントにルーティングします。たとえば、OrderItem Java オブジェクトインスタンスを $1,000 を超える値の注文品目のHighValueOrdersValidationJMS キューにルーティングし、すべての注文品目 (無条件) を XML/JSON としてログ用の HTTP エンドポイントにルーティングします。
10.2. Apache Camel を使用したルーティング リンクのコピーリンクがクリップボードにコピーされました!
- メッセージフラグメントを Apache Camel エンドポイントにルーティングするには、http://www.milyn.org/xsd/smooks/camel-1.4.xsd 設定 namespace の camel:route 設定を使用します。
- Smooks 設定で以下を指定して、Camel エンドポイントにルーティングします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上記の例では、Javabeans は Smooks BeanContext から Camel エンドポイントにルーティングされます。これらの同じ Bean にテンプレート (FreeMarker など) を適用し、Bean (XML や CSV など) の代わりにテンプレート結果をルーティングすることもできます。routeOnElement.
第11章 パフォーマンスチューニング リンクのコピーリンクがクリップボードにコピーされました!
11.1. パフォーマンスチューニングのヒント リンクのコピーリンクがクリップボードにコピーされました!
- Smooks オブジェクトをキャッシュおよび再利用します。
- Smooks の初期化には時間がかかるため、再利用することが重要です。
- 可能な場合は、リーダーインスタンスをプールする
- 一部のリーダーは作成に非常にコストがかかるため、パフォーマンスが大幅に向上する可能性があります。
- 可能な場合は、SAX フィルタリングを使用する
SAX処理は、DOM処理よりもはるかに高速であり、使用するメモリーも少なくなります。大きなメッセージを処理するには、必須です。すべての Smooks カートリッジがSAX互換であることを確認します。- デバッグログをオフにする
- Smooks は、コードの一部で集中的なデバッグログを実行します。これにより、処理のオーバーヘッドが大幅に増加し、スループットが低下する可能性があります。重要ログをまったく設定しないと、デバッグログステートメントが実行される可能性があることに注意してください。
- HTMLReportGenerator は、開発環境のみで使用してください。
HTMLReportGeneratorを有効にすると、パフォーマンスのオーバーヘッドが大きくなり、メッセージが大きい場合は、OutOfMemory例外が発生する可能性もあります。- コンテキストセレクター
- コンテキストセレクターは明らかにパフォーマンスに悪影響を及ぼす可能性があります。たとえば、
"a/b/c/d/e"のようなセレクターの一致を評価するには、"d/e"のようなセレクターよりも多くの処理が必要になることは明らかです。明らかに、データモデルが深いセレクターを必要とする状況がありますが、そうでない場合は、セレクターのパフォーマンスを最適化するようにしてください。可能な場合は、仮想 Bean モデルの使用を回避し、マップの代わりに Bean を作成してください。マップへのデータの作成と追加は、単純な古い Java オブジェクト (POJO) を作成し、セッターメソッドを呼び出すよりもはるかに時間がかかります。
第12章 テスト リンクのコピーリンクがクリップボードにコピーされました!
12.1. 単体テスト リンクのコピーリンクがクリップボードにコピーされました!
- Smooks で単体テストを行うには、次の例に従います。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上記のテストケースでは、XMLUnit と呼ばれるソフトウェアを使用します (詳細については、http://xmlunit.sourceforge.net を参照)。注記上記のテストには、次の Maven 依存関係が必要でした。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第13章 一般的なユースケース リンクのコピーリンクがクリップボードにコピーされました!
13.1. 巨大なメッセージの処理のサポート リンクのコピーリンクがクリップボードにコピーされました!
One-to-one transformation: これは、巨大なメッセージをソース形式 (XML など) からターゲット形式 (EDI、CSV、XML など) に変換するプロセスです。Splitting and routing: 巨大なメッセージを任意の形式 (EDI、XML、Java など) の小さな (より消費しやすい) メッセージに分割し、それらの小さなメッセージをさまざまな宛先タイプ (ファイル、JMS、データベース) にルーティングします。Persistence: 巨大なメッセージのコンポーネントをデータベースに保持し、そこからより簡単にクエリーおよび処理できるようにします。Smooks 内では、これを分割とルーティング (データベースへのルーティング) の形式と見なします。
13.2. FreeMarker を使用して、巨大なメッセージを変換する リンクのコピーリンクがクリップボードにコピーされました!
- モデルに FreeMarker と NodeModel を使用します。
- モデルに FreeMarker と Java オブジェクトモデルを使用します。Javabean Cartridge を使用して、メッセージ内のデータからモデルを構成できます。
13.3. 巨大なメッセージと NodeModel リンクのコピーリンクがクリップボードにコピーされました!
13.4. 複数の NodeModel を取得するように、Smooks を設定する リンクのコピーリンクがクリップボードにコピーされました!
- FreeMarker テンプレートで使用する複数の NodeModel を取得するように、Smooks を設定するには、DomModelCreator ビジターを設定する必要があります。各モデルのルートノードを対象とする必要があります。Smooks は、これを SAX フィルタリング (巨大なメッセージを処理するために重要) でも使用できるようにすることに注意してください。これは、メッセージの NodeModel を作成するための Smooks 設定です。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次に、次の FreeMarker テンプレートを適用します。
- 注文品目までは含まれない、注文
headerの詳細を出力するテンプレート。 - salesorder の item 要素を生成するための、注文品目ごとのテンプレート。
- メッセージを閉じるためのテンプレート。
Smooks では、2 つの FreeMarker テンプレートを定義すると、これを実装できます。1 つ目は上記のポイント 1 と 3 (結合) をカバーし、2 つ目は項目要素をカバーします。 - 最初の FreeMarker テンプレートを適用します。注文品目要素を対象としており、次のようになります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ?TEMPLATE-SPLIT-PI?処理命令は、テンプレートを分割する場所を Smooks に指示し、テンプレートの最初の部分を注文品目要素の先頭に出力し、残りの部分を注文品目要素の末尾に出力します。item 要素テンプレート (2 つ目のテンプレート) は間に出力されます。 - 2 つ目の FreeMarker テンプレートを適用します。これは、ソースメッセージ内のすべての注文品目要素の末尾に品目要素を出力します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 2 つ目のテンプレートは注文品目要素の末尾で起動するため、最初のテンプレートの?TEMPLATE-SPLIT-PI?処理命令の場所に出力を効果的に生成します。2 つ目のテンプレートは、NodeModel のorderでデータを参照することもできることに注意してください。 - 任意のクロージングテンプレートを適用します。注記巨大なメッセージの 1 対 1 変換を実行するこのアプローチが機能する理由は、一度にメモリーにあるオブジェクトが注文ヘッダーの詳細と現在の注文品目の詳細 (仮想オブジェクトモデル内) のみであるためです。ソースメッセージ内のすべてのデータへのフルアクセスが常に必要なほど変換があいまいな場合、たとえば、メッセージですべての注文品目の順序を逆にする (または並べ替える) 必要がある場合は、明らかに機能します。ただし、このような場合は、注文の詳細と品目をデータベースにルーティングし、データベースのストレージ、クエリー、およびページング機能を使用して、変換を実行するオプションがあります。
13.5. メッセージ分割の要件 リンクのコピーリンクがクリップボードにコピーされました!
destination1: ファイルシステム経由の XML が必要です。destination2: JMS キューによって Java オブジェクトが必要です。destination3: データベースなどのテーブルからメッセージを取得します。destination4: JMS キュー経由の EDI メッセージが必要です。
13.6. Smooks による分割メッセージのストリーミング リンクのコピーリンクがクリップボードにコピーされました!
- ルーティングするフラグメントのスタンドアロンメッセージ (分割) を繰り返し作成します。
- 一意の beanId の下で、分割メッセージを Bean コンテキストに繰り返しバインドします。
- 分割メッセージを必要なエンドポイント (ファイル、DB、JMS、または ESB のいずれか) に繰り返しルーティングします。
13.7. 分割メッセージの作成方法 リンクのコピーリンクがクリップボードにコピーされました!
- 基本的な (変換/エンリッチされていない) フラグメントの分割とバインド。これにより、メッセージフラグメントが (繰り返し) XML 形式にシリアル化され、Bean コンテキストに文字列として保存されます。
- Java バインドおよびテンプレートカートリッジを使用するより複雑なアプローチでは、Smooks を設定して、ソースメッセージからデータを抽出し、Bean コンテキストに入れ (jb:bean 設定を使用)、テンプレートを適用して (オプション)、分割メッセージを作成できます。これには、次の利点があります。
- 基本オプションと同様、XML だけでなく、分割フラグメントを変換できます。
- メッセージのエンリッチを実現します。
- 複数のソースフラグメントからのデータを各分割メッセージにマージする機能を使用して、より複雑な分割を実現します。たとえば、orderItem フラグメントだけでなく、注文ヘッダー情報も同様です。
- 分割メッセージとして Java オブジェクトを分割およびルーティングできます (たとえば、JMS 経由)。
13.8. メッセージのシリアル化 リンクのコピーリンクがクリップボードにコピーされました!
- メッセージのフラグメントを分割およびルーティングするには、ルーティングカートリッジの基本的な frag:serialize および *:router コンポーネント (jms:router、file:router など) を使用します。frag:serialize コンポーネントには、http://www.milyn.org/xsd/smooks/fragment-routing-1.2.xsd namespace に独自の設定があります。
- 以下の例を使用して、SOAP メッセージ本文のコンテンツをシリアル化し、soapBody の beanId の下の Bean コンテキストに保存します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のコードを使用して、実行します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - これをプログラムで行うには、次のコードを使用します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
13.9. 分割メッセージのルーティングの例 リンクのコピーリンクがクリップボードにコピーされました!
13.10. ファイルベースのルーティング リンクのコピーリンクがクリップボードにコピーされました!
13.11. ファイルベースのルーティングコンポーネント リンクのコピーリンクがクリップボードにコピーされました!
| コンポーネント | 説明 |
|---|---|
| Javabean カートリッジ | メッセージからデータを抽出し、Bean コンテキストの変数に保持します。テンプレートデータモデルとして使用される注文および注文品目データを取得するために、DOM NodeModel を使用することもできます。 |
| file:outputStream | ルーティングカートリッジからのこの設定は、ファイルシステムストリームの管理に使用されます (命名、開始、終了、調整の作成など)。 |
| テンプレートカートリッジ (FreeMarker テンプレート) | Javabean カートリッジによって Bean コンテキストにバインドされたデータから個別の分割メッセージを生成するために使用されます (上記の最初のポイントを参照)。テンプレート結果は、ファイル出力ストリームに書き込まれます (上記の 2 つ目のポイントを参照)。 |
13.12. 巨大なメッセージの処理 リンクのコピーリンクがクリップボードにコピーされました!
巨大なメッセージの処理
この例では、個別の注文品目の詳細をファイルにルーティングしながら、大量の注文メッセージを送信する必要があります。分割メッセージには、注文ヘッダーとルート要素からのデータが含まれています。
file:outputStream 設定は、ファイルシステム上のファイルの生成を管理します。設定からわかるように、ファイル名は Bean コンテキストのデータから動的に構成できます。highWaterMark 設定パラメーターによってファイルの作成を調整できることもわかります。これにより、ターゲットファイルシステムを圧倒しないように、ファイル作成を管理できます。
file:outputStream (設定番号 3) によって作成された OutputStream に書き込むために使用される FreeMarker テンプレートリソースを定義します。設定 4 が file:outputStream リソースを参照する方法を確認してください。Freemarker テンプレートは次のとおりです。
13.13. JMS ルーティング リンクのコピーリンクがクリップボードにコピーされました!
JMS ルーティング
JMSルーティングは、http://www.milyn.org/xsd/smooks/jms-routing-1.2.xsd 設定 namespace の jms:router 設定で実行されます。以下は、orderItem_xml Bean を smooks.exampleQueue という名前の JMS キューにルーティングする jms:router 設定の例です。
13.14. データベースへのルーティング リンクのコピーリンクがクリップボードにコピーされました!
- 注文および注文品目データをデータベースにルーティングするには、データストリームから注文および注文品目データを抽出する一連の Java バインドを定義する必要があります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次に、データソース設定とそのデータソースを使用して、Java オブジェクトモデルにバインドされたデータをデータベースに挿入する多くの db:executor 設定を定義する必要があります。データベースへの直接接続を取得するためのデータソース設定 (namespace http://www.milyn.org/xsd/smooks/datasource-1.3.xsd) です。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - データベース接続を取得するために、JNDI データソースを使用できます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - データソーススキーマは、データソースを設定する方法を説明および文書化します。これは db:executor 設定です (namespace http://www.milyn.org/xsd/smooks/db-routing-1.1.xsd):
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第14章 Smooks の拡張 リンクのコピーリンクがクリップボードにコピーされました!
14.1. Smooks の API リンクのコピーリンクがクリップボードにコピーされました!
API
既存のすべての Smooks 機能 (Java バインド、EDI 処理など) は、明確に定義された多くの API の拡張によって構築されています。
- リーダー API
- ソース/入力データ (リーダー) を処理して、すべてのメッセージフラグメントとサブフラグメントに明確に定義された一連の階層イベント (SAX イベントモデルに基づく) として他の Smooks コンポーネントによって消費できるようにするためのもの。
- ビジター API
- ソース/入力リーダーによって生成されたメッセージフラグメント SAX イベントを消費するためのもの。
14.2. Smooks コンポーネントの設定 リンクのコピーリンクがクリップボードにコピーされました!
SmooksResourceConfiguration インスタンスを使用して設定された resources です。
14.3. namespace 固有の設定 リンクのコピーリンクがクリップボードにコピーされました!
SmooksResourceConfiguration クラスに直接マッピングされる設定) は、基本設定 namespace (http://www.milyn.org/xsd/smooks-1.1.xsd)。
14.4. namespace 固有の設定例 リンクのコピーリンクがクリップボードにコピーされました!
selector属性は、リソースを選択する機能です (たとえば、ビジター実装の XPath にすることができます)。resource要素は実際のリソースです。これは、Java クラス名またはテンプレートなどの他の形式のリソースにすることができます。このセクションの残りの部分では、リソースは Java クラス名であると想定されます。param要素は、resource 要素に定義されたリソースの設定パラメーターです。
14.5. ランタイム表現 リンクのコピーリンクがクリップボードにコピーされました!
14.6. 設定アノテーション リンクのコピーリンクがクリップボードにコピーされました!
<param> 要素の詳細を設定する必要があります。これは、@ConfigParam および @Config アノテーションを使用すると、実行されます。
14.7. @ConfigParam アノテーション リンクのコピーリンクがクリップボードにコピーされました!
@ConfigParam アノテーションは、アノテーション付きのプロパティ自身と同じ名前を持つ <param> 要素から名前付きパラメーターを反射的に注入します。名前は異なる場合がありますが、デフォルトの動作はコンポーネントプロパティーの名前に一致します。
14.8. @ConficParam の利点 リンクのコピーリンクがクリップボードにコピーされました!
- <param> 値をアノテーション付きのコンポーネントプロパティーに設定する前に、そのデコードを処理します。Smooks は、すべての主要な型 (int、Double、File、Enum など) に DataDecoder を提供しますが、すぐに使用できるデコーダーが特定のデコード要件をカバーしていない場合は、カスタム DataDecoder を実装および使用できます (例:
@ConfigParam(decoder = MyQuirkyDataDecoder.class))。カスタムデコーダーが登録されている場合、Smooks はカスタムデコーダーを自動的に使用します (つまり、このアノテーションでデコーダープロパティーを定義する必要はありません)。Smooks が、特定のデータ型をデコードするために、DataDecoder 実装を自動的に見つけられるように、DataDecoder 実装を登録する方法の詳細については、DataDecoder Javadocs を参照してください。 configプロパティのchoice制約をサポートし、設定値が定義された選択値の 1 つではない場合、設定例外を生成します。たとえば、ONとOFFの制約付きの値セットを持つプロパティーがあるとします。このアノテーションの Choice プロパティーを使用して、設定を制約したり、例外を発生させたりすることができます。(たとえば、@ConfigParam(choice = {"ON", "OFF"})です。)@ConfigParam(defaultVal = "true")など、デフォルトの設定値を指定できます。@ConfigParam(use = Use.OPTIONAL)など、プロパティー設定値が必須かオプションかを指定できます。デフォルトでは、すべてのプロパティーは、REQUIREDですが、defaultValを設定すると、プロパティーは、OPTIONALと暗黙的にマークされます。
14.9. @ConfigParam アノテーションの使用 リンクのコピーリンクがクリップボードにコピーされました!
DataSeeder とそれに対応する Smooks 設定を示しています。
14.10. @Config アノテーション リンクのコピーリンクがクリップボードにコピーされました!
@Config アノテーションは、コンポーネントリソースに関連付けられた完全な SmooksResourceConfiguration インスタンスをアノテーション付きのコンポーネントプロパティに反射的に注入します。タイプ SmooksResourceConfiguration ではないコンポーネントプロパティーにこのアノテーションを追加すると、エラーが発生します。
14.11. @Config アノテーションの使用 リンクのコピーリンクがクリップボードにコピーされました!
14.12. @Initialize と @Uninitialize リンクのコピーリンクがクリップボードにコピーされました!
@Initialize アノテーションを提供しています。
@Uninitialize アノテーションを提供しています。
14.13. 基本的な初期化/初期化解除シーケンス リンクのコピーリンクがクリップボードにコピーされました!
14.14. @Initialize と @Uninitialize の使用 リンクのコピーリンクがクリップボードにコピーされました!
概要
この例では、初期化時にデータベースへの複数の接続を開いて、Smooks インスタンスを閉じる際、それらのデータベースリソースをすべて解放する必要があるコンポーネントがあるとします。
@Initialize および @Uninitialize アノテーションを使用する場合は、次の点に注意する必要があります。
@Initializeおよび@Uninitializeメソッドは、引数なしのパブリックメソッドである必要があります。@ConfigParamプロパティーは、最初の@Initializeメソッドが呼び出される前に、すべて初期化されます。したがって、@ConfigParamコンポーネントプロパティーを初期化プロセスへの入力として使用できます。@Uninitializeメソッドは、すべてSmooks.closeメソッドの呼び出しに応答して、呼び出されます。
14.15. カスタム設定 namespace の定義 リンクのコピーリンクがクリップボードにコピーされました!
<resource-config> 基本設定を使用して、検証可能なコンポーネントの XSD ベースのカスタム設定をすべて一般的な Smooks リソースとして扱うのではなく、サポートできます。
14.16. カスタム設定 namespace の使用 リンクのコピーリンクがクリップボードにコピーされました!
- 基本 http://www.milyn.org/xsd/smooks-1.1.xsd 設定 namespace を拡張するコンポーネントの設定 XSD を記述します。この XSD は、コンポーネントのクラスパスで提供する必要があります。
/META-INF/フォルダーに配置され、namespace URI と同じパスを持つ必要があります。たとえば、拡張 namespace URI が http://www.acme.com/schemas/smooks/acme-core-1.0.xsd の場合は、/META-INF/schemas/smooks/acme-core-1.0.xsdのクラスパスに物理 XSD ファイルを指定する必要があります。 - カスタム namespace 設定を
SmooksResourceConfigurationインスタンスにマッピングする Smooks 設定 namespace マッピング設定ファイルを記述します。このファイルは、マッピングする namespace の名前に基づいて (慣例により)、名前を付ける必要があり、XSD と同じフォルダー内のクラスパスに物理的に配置する必要があります。上記の例を拡張すると、Smooks マッピングファイルは、/META-INF/schemas/smooks/acme-core-1.0.xsd-smooks.xmlになります。-smooks.xml接尾辞に注意してください。
14.17. ソースリーダーの実装 リンクのコピーリンクがクリップボードにコピーされました!
org.xml.sax.XMLReader インターフェイスを実装していることです。ただし、リーダー実装を設定できるようにする場合は、リーダーが、org.milyn.xml.SmooksXMLReader インターフェースを実装する必要があります。org.milyn.xml.SmooksXMLReader は org.xml.sax.XMLReader の拡張です。既存の org.xml.sax.XMLReader 実装を使用することも、新しいものを実装することも簡単です。
14.18. Smooks で使用するソースリーダーの実装 リンクのコピーリンクがクリップボードにコピーされました!
- 次のように、まず、基本的なリーダークラスを実装する必要があります。
public class MyCSVReader implements SmooksXMLReader { // Implement all of the XMLReader methods... }public class MyCSVReader implements SmooksXMLReader { // Implement all of the XMLReader methods... }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 特に興味深いものは、org.xml.sax.XMLReaderインターフェイスの 2 つのメソッドです。setContentHandler(ContentHandler)は Smooks Core によって呼び出されます。リーダーのorg.xml.sax.ContentHandlerインスタンスを設定します。org.xml.sax.ContentHandlerインスタンスメソッドは、parse(InputSource)メソッド内から呼び出されます。parse(InputSource): これは、ソースデータ入力ストリームを受け取り、解析し (つまり、この例の場合は、CSVストリーム)、setContentHandler(ContentHandler)メソッドで提供されるorg.xml.sax.ContentHandlerインスタンスの呼び出しで SAX イベントストリームを生成するメソッドです。
詳細については、http://download.oracle.com/javase/6/docs/api/org/xml/sax/ContentHandler.html を参照してください。 - CSV レコードに関連付けられたフィールドの名前を使用して、CSV リーダーを設定します。カスタムリーダー実装の設定は、いずれの Smooks コンポーネントでも同じです。以下の例を参照してください。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 基本的なリーダー実装スタブができると、単体テストの作成を開始して、新しいリーダー実装をテストできます。これを行うには、CSV 入力が必要です。
names.csvという名前のファイル内の名前の単純なリストを特徴とする以下の例を確認してください。Tom,Jones Mike,Jones Mark,Jones
Tom,Jones Mike,Jones Mark,JonesCopy to Clipboard Copied! Toggle word wrap Toggle overflow - テスト Smooks 設定を使用して、MyCSVReader で Smooks を設定します。前述のとおり、Smooks では、すべてがリソースであり、基本的な
<resource-config>設定を行うことができます。これは、問題なく動作しますが、少し「うるさい」ため、Smooks は、特にリーダーを設定するために、基本的な<reader>設定要素を提供しています。テストの設定は、mycsvread-config.xmlで次のようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - JUnit テストクラスを実装します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow parseメソッドを実装します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 単体テストクラスを実行して、コンソールに次の出力を表示します (フォーマット済み)。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この後は、テストの拡張、リーダー実装コードの強化などのケースです。その後、リーダーを使用して、Smooks でサポートされているさまざまな操作を実行できます。
14.19. java-binding-config.xml を使用したリーダーの設定例 リンクのコピーリンクがクリップボードにコピーされました!
java-binding-config.xml) を使用すると、名前を PersonName オブジェクトのList にバインドできます。
14.20. リーダーを使用するためのヒント リンクのコピーリンクがクリップボードにコピーされました!
- リーダーインスタンスが同時に使用されることはありません。Smooks Coreは、メッセージごとに新しいインスタンスを作成するか、
readerPoolSizeFilterSettingsプロパティに従って、インスタンスをプールおよび再利用します。 - リーダーは、現在のフィルタリングコンテキストの Smooks
ExecutionContextにアクセスする必要がある場合、org.milyn.xml.SmooksXMLReaderインターフェイスを実装する必要があります。 - ソースデータがバイナリーデータストリームである場合、リーダーは、
org.milyn.delivery.StreamReaderインターフェイスを実装する必要があります。 GenericReaderConfiguratorインスタンスを使用して、ソースコード (単体テストなど) 内でリーダーを設定し、Smooksインスタンスに設定できます。- 基本的な <reader> 設定は問題ありませんが、カスタム CSV リーダー実装用にカスタム設定 namespace (XSD) を定義できます。このトピックは、ここでは扱いません。ソースコードを確認して、Smooks に付属するリーダー実装の拡張設定 namespace (
EDIReader、CSVReader、JSONReaderなど) を確認します。これから、独自のカスタムリーダーでこれを行う方法を考え出すことができるはずです。
14.21. バイナリーソースリーダー リンクのコピーリンクがクリップボードにコピーされました!
org.milyn.delivery.StreamReader インターフェイスを実装する必要があります。これは、InputStream が提供されるように、Smooks ランタイムに指示する単なるマーカーインターフェイスです。
parse メソッドの実装が、InputSource からのInputStream を使用し (つまり、InputSource.getCharacterStream() ではなく、InputSource..getByteStream() を呼び出し)、デコードされたバイナリーデータから XML イベントを生成する必要がある点では異なります。
14.22. バイナリーソースリーダーの実装 リンクのコピーリンクがクリップボードにコピーされました!
- バイナリーソースリーダーを実装するには、次の
parseメソッド実装を確認してください。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 他のリーダーと同様、Smooks 設定に
BinaryFormatXXReaderリーダーを設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Smooks の実行コードを実行します (
StreamSourceに提供されるInputStreamに注意してください)。この場合、XML オブジェクトと Java オブジェクトの 2 つの結果が生成されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
14.23. ビジター実装 リンクのコピーリンクがクリップボードにコピーされました!
ExecutionContext および ApplicationContext コンテキストオブジェクトでコラボレーションして、共通の目標を達成します。
14.24. サポート対象のビジター実装 リンクのコピーリンクがクリップボードにコピーされました!
org.milyn.delivery.sax.SAXVisitorサブインターフェイスに基づく SAX ベースの実装。org.milyn.delivery.dom.DOMVisitorサブインターフェイスに基づく DOM ベースの実装。
14.25. SAX と DOM のビジター実装 リンクのコピーリンクがクリップボードにコピーされました!
Smooks.filterSource メソッドの複数の同時呼び出しで同時に使用できる必要があります。現在の Smooks.filterSource 実行に関連するすべての状態は、ExecutionContext に保存する必要があります。
14.26. SAX ビジター API リンクのコピーリンクがクリップボードにコピーされました!
SAXVisitor 実装が取得および処理できる org.xml.sax.ContentHandler SAX イベントに基づいています。SAXVisitor 実装によって解決されるユースケースに応じて、これらのインターフェイスの 1 つまたはすべてを実装する必要がある場合があります。
14.27. SAX ビジター API インターフェイス リンクのコピーリンクがクリップボードにコピーされました!
org.milyn.delivery.sax.SAXVisitBefore- 対象のフラグメント要素の
startElementSAX イベントを取得します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow org.milyn.delivery.sax.SAXVisitChildren- 対象のフラグメント要素の文字ベースの SAX イベント、および子フラグメント要素の
startElementイベントに対応する Smooks 生成 (疑似) イベントを取得します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow org.milyn.delivery.sax.SAXVisitAfter- 対象のフラグメント要素の
endElementSAX イベントを取得します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
14.28. SAX ビジター API の例 リンクのコピーリンクがクリップボードにコピーされました!
XML を使用した API イベントの図解
これにより、3 つのインターフェイスが org.milyn.delivery.sax.SAXElementVisitor インターフェイス内で 1 つのインターフェイスにまとめられます。
org.milyn.delivery.sax.SAXElement タイプは、すべてのメソッド呼び出しで渡されます。このオブジェクトには、属性とその値を含む、対象のフラグメント要素に関する詳細が含まれています。また、テキストの蓄積を管理するためのメソッド、および Smooks.filterSource(Source, Result) メソッド呼び出しで渡された可能性がある StreamResult インスタンスに関連する Writer へのアクセスが含まれています。
14.29. SAX によるテキスト蓄積 リンクのコピーリンクがクリップボードにコピーされました!
14.30. org.milyn.delivery.sax.SAXElement リンクのコピーリンクがクリップボードにコピーされました!
org.milyn.delivery.sax.SAXElement は、常に対象の要素に関連する属性データを含みますが、フラグメントの子テキストデータを含みません。SAX イベント (SAXVisitChildren.onChildText) が SAXVisitBefore.visitBefore イベントと SAXVisitAfter.visitAfter イベントの間に発生します。テキストイベントは、SAXElement に蓄積されません。その結果、パフォーマンスが大幅に低下する可能性があるためです。この欠点は、SAXVisitor 実装がフラグメントのテキストコンテンツにアクセスする必要がある場合、対象のフラグメントのテキストを蓄積するように、Smooks に明示的に指示する必要があることです。これは、SAXVisitor の SAXVisitBefore.visitBefore メソッド実装内から SAXElement.accumulateText メソッドを呼び出すと、実行されます。
14.31. テキスト蓄積の例 リンクのコピーリンクがクリップボードにコピーされました!
14.32. @TextConsumer アノテーション リンクのコピーリンクがクリップボードにコピーされました!
@TextConsumer アノテーションは、SAXVisitBefore.visitBefore メソッドを使用する代わりに、SAXVisitor 実装をアノテーションするために、使用することができます。
14.33. @TextConsumer の例 リンクのコピーリンクがクリップボードにコピーされました!
SAXVisitAfter.visitAfter イベントの終了後、公開されます。
14.34. StreamResult の書き込み/シリアル化 リンクのコピーリンクがクリップボードにコピーされました!
概要
Smooks.filterSource(Source, Result) メソッドは、多くの異なる Result 型実装のうちの 1 つ以上を取ることができ、そのうちの 1 つが javax.xml.transform.stream.StreamResult クラスです。Smooks は、StreamResult インスタンスでソースを流入させ、再び流出させます。
Smooks.filterSource(Source, Result) メソッドに提供される任意の StreamResult インスタンスにシリアル化します。Smooks.filterSource(Source, Result) メソッドに提供されたソースが XML ストリームであり、StreamResult インスタンスが Result インスタンスの 1 つとして提供された場合は、Smooks インスタンスが 1 つ以上のフラグメントを変更する 1 つ以上の SAXVisitor 実装で設定されていないかぎり、ソース XML は未変更の StreamResult に書き出されます。
14.35. StreamResult の書き込み/シリアル化の設定 リンクのコピーリンクがクリップボードにコピーされました!
- デフォルトのシリアル化動作をオンまたはオフにするには、フィルター設定にアクセスし、そのように設定します。
- メッセージフラグメントの 1 つのシリアル化された形式を変更するには、
SAXVisitorを実装して、変換を実行し、XPath のような式を使用して、メッセージフラグメントをターゲットとします。 - メッセージフラグメントのシリアル化された形式を変更するには、提供されているテンプレートコンポーネントのいずれかを使用します。これらのコンポーネントは、
SAXVisitor実装でもあります。
14.36. SAXVisitor の実装 リンクのコピーリンクがクリップボードにコピーされました!
- フラグメントのシリアル化された形式を変換するための
SAXVisitorを実装するには、SAXVisitor実装がStreamResultに書き込まれるように、Smooks をプログラミングします。これは、Smooks が 1 つのフラグメントで複数のSAXVisitor実装のターゲティングをサポートしているためですが、フラグメントごとにStreamResultに書き込むことができるSAXVisitorは、1 つだけです。 - 2 つ目の
SAXVisitorがStreamResultに書き込もうとすると、SAXWriterAccessExceptionが発生し、Smooks 設定を変更する必要があります。 - 記述する
StreamResultを指定するには、SAXVisitorが、StreamResultへのWriterの所有権を取得する必要があります。これは、SAXVisitBefore.visitBeforeメソッド実装内から、SAXElement.getWriter(SAXVisitor)メソッドを呼び出し、thisをSAXVisitorパラメーターとして渡すと、実行されます。
14.37. SAXVisitor の実装例 リンクのコピーリンクがクリップボードにコピーされました!
14.38. SAXElement.setWriter リンクのコピーリンクがクリップボードにコピーされました!
Writer インスタンスをリセットするために必要なサブフラグメントのシリアル化を制御できるため、サブフラグメントのシリアル化を流用できます。
Writer の所有権を獲得するための SAXElement.getWriter メソッドを呼び出すためだけに、SAXVisitBefore.visitBefore メソッドを実装することは非効率的です。このため、@StreamResultWriter アノテーションがあります。@TextConsumer アノテーションと組み合わせて使用すると、SAXVisitAfter.visitAfter メソッドを実装するだけで十分です。
14.39. StreamResultWriter の例 リンクのコピーリンクがクリップボードにコピーされました!
14.40. SAXToXMLWriter リンクのコピーリンクがクリップボードにコピーされました!
SAXToXMLWriter クラスを提供します。SAXElement データを XML としてシリアル化するプロセスを簡素化します。このクラスでは、SAXVisitor 実装を記述できます。
14.41. SAXToXMLWriter の例 リンクのコピーリンクがクリップボードにコピーされました!
14.42. SAXToXMLWriter の設定 リンクのコピーリンクがクリップボードにコピーされました!
SAXToXMLWriterでSAXVisitor実装を記述する場合は、SAXToXMLWriterコンストラクターにブール値を設定します。encodeSpecialCharsargであり、rewriteEntitiesフィルター設定に基づいて、設定する必要があります。@StreamResultWriterアノテーションをクラスからSAXToXMLWriterインスタンス宣言に移動します。この結果、Smooks は、SAXToXMLWriterインスタンスを作成し、関連する Smooks インスタンスのrewriteEntitiesフィルター設定で初期化されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
14.43. ビジター設定 リンクのコピーリンクがクリップボードにコピーされました!
SAXVisitor 設定は、テスト目的に役立ち、他の Smooks コンポーネントとまったく同様に機能します。Smooks ビジターインスタンスを設定する場合は、設定 selector は、XPath 式と同様に解釈されます。ビジターインスタンスは、Smooks インスタンスのプログラムコード内で設定できます。
14.44. ビジター設定の例 リンクのコピーリンクがクリップボードにコピーされました!
SAXVisitor 実装を使用します。
OK の<order-item> フラグメントをトリガーするように、ChangeItemState を宣言的に設定すると、次のようになります。
ChangeItemState コンポーネントに定義できます。カスタム設定 namespace コンポーネントは次のように設定されます。
14.45. ExecutionLifecycleCleanable リンクのコピーリンクがクリップボードにコピーされました!
ExecutionLifecycleCleanable ライフサイクルインターフェイスを実装するビジターコンポーネントはポスト Smooks.filterSource ライフサイクル操作を実行できます。以下の例を参照してください。
executeExecutionLifecycleCleanup 呼び出しに注意)。
Smooks.filterSource 実行ライフサイクルの周囲にスコープされたリソースを関連する ExecutionContext のためにクリーンアップできます。
14.46. VisitLifecycleCleanable リンクのコピーリンクがクリップボードにコピーされました!
VisitLifecycleCleanable ライフサイクルインターフェイスを実装するビジターコンポーネントはポスト SAXVisitAfter.visitAfter ライフサイクル操作を実行できます。
public interface VisitLifecycleCleanable extends Visitor
{
public abstract void executeVisitLifecycleCleanup(ExecutionContext executionContext);
}
public interface VisitLifecycleCleanable extends Visitor
{
public abstract void executeVisitLifecycleCleanup(ExecutionContext executionContext);
}
executeVisitLifecycleCleanup 呼び出しに注意)。
SAXVisitor 実装の 1 つのフラグメント実行の周囲にスコープされたリソースを関連する ExecutionContext のためにクリーンアップできます。
14.47. ExecutionContext リンクのコピーリンクがクリップボードにコピーされました!
ExecutionContext は状態情報を保存するためのコンテキストオブジェクトです。Smooks.filterSource メソッドの 1 回の実行に特化して、スコープされています。すべての Smooks ビジター実装は、1 つの Smooks.filterSource 実行のコンテキスト内でステートレスである必要があり、ビジター実装を Smooks.filterSource メソッドの複数の同時実行で使用できるようにします。ExecutionContext インスタンスに保存されているすべてのデータは、Smooks.filterSource 実行の完了時、失われます。ExecutionContext は、すべてのビジター API メッセージイベント呼び出しで提供されます。
14.48. ApplicationContext リンクのコピーリンクがクリップボードにコピーされました!
ApplicationContext は状態情報を保存するためのコンテキストオブジェクトです。関連する Smooks インスタンスの周囲にスコープされます。つまり、1 つの Smooks インスタンスにつき、1 つの ApplicationContext インスタンスのみが存在します。このコンテキストオブジェクトは、複数の Smooks.filterSource 実行で維持およびアクセスする必要があるデータを保存するために、使用できます。コンポーネント (SAXVisitor コンポーネントを含む) は、ApplicationContext クラスプロパティを宣言し、@AppContext アノテーションを付けて、関連する ApplicationContext インスタンスにアクセスできます。以下の例を参照してください。
第15章 Apache Camel との統合 リンクのコピーリンクがクリップボードにコピーされました!
15.1. Apache Camel-Smooks との統合 リンクのコピーリンクがクリップボードにコピーされました!
15.2. Apache Camel で Smooks を使用する方法 リンクのコピーリンクがクリップボードにコピーされました!
- SmooksComponent
- SmooksDataformat
- SmooksProcessor
15.3. SmooksComponent リンクのコピーリンクがクリップボードにコピーされました!
15.4. SmooksComponent の使用 リンクのコピーリンクがクリップボードにコピーされました!
- 次のように、Camel ルート設定にルートを追加します。
from("file://inputDir?noop=true") .to("smooks://smooks-config.xml") .to("jms:queue:order")from("file://inputDir?noop=true") .to("smooks://smooks-config.xml") .to("jms:queue:order")Copy to Clipboard Copied! Toggle word wrap Toggle overflow - smooks-config-xml ファイルの値を編集します。ルート設定を見ただけでは、SmooksComponent が生成している出力のタイプを判断することはできません。代わりに、これは exports 要素によって Smooks 設定で表現されます。注記Smooks をプログラムで設定する場合は、SmooksProcessor を使用すると、設定できます。
15.5. SmooksComponent の設定 リンクのコピーリンクがクリップボードにコピーされました!
- reportPath: これは、生成される Smooks 実行レポートへのパス (ファイル名を含む) です。
15.6. SmooksDataFormat リンクのコピーリンクがクリップボードにコピーされました!
15.7. SmooksDataFormat の例 リンクのコピーリンクがクリップボードにコピーされました!
15.8. SmooksProcessor リンクのコピーリンクがクリップボードにコピーされました!
15.9. SmooksProcessor の例 リンクのコピーリンクがクリップボードにコピーされました!
15.10. Camel プロパティー リンクのコピーリンクがクリップボードにコピーされました!
| 名前 | 説明 |
|---|---|
camel-dataformat |
この例は、SmooksDataFormat の使用方法を示しています。(DataFormat は、Camel の org.apache.camel.spi.DataFormat を実装するクラスです。)
|
camel-integration |
この例は、Camel SmooksComponent の使用方法を示しています。(smooks://file:./configs/smooks-config.xml)
|
splitting-camel |
この例は、Smooks と Apache Camel を使用して、UN/EDIFACT メッセージ交換を処理し、個別の交換メッセージを Java および XML フラグメントに分割し、Apache Camel を使用して、フラグメントをルーティングする方法を示しています。
|
第16章 Smooks と JBoss Enterprise SOA Platform の統合 リンクのコピーリンクがクリップボードにコピーされました!
16.1. Message Transformation リンクのコピーリンクがクリップボードにコピーされました!
transform_ クイックスタートを確認して、それらがどのように動作するかを理解してください。XML2XML の例は、学習に適しています。
16.2. resource-config プロパティー リンクのコピーリンクがクリップボードにコピーされました!
URIResourceLocator クラスで定義される任意の URI ベースのリソースを指定できます。
<action name="transform" class="org.jboss.soa.esb.actions.converters.SmooksTransformer">
<property name="resource-config" value="/smooks-config.xml" ></property>
</action>
<action name="transform" class="org.jboss.soa.esb.actions.converters.SmooksTransformer">
<property name="resource-config" value="/smooks-config.xml" ></property>
</action>
16.3. 入出力設定 リンクのコピーリンクがクリップボードにコピーされました!
MessagePayloadProxy を使用して、メッセージペイロードにアクセスします。デフォルトでは、Message.Body.DEFAULT_LOCATION 位置からペイロードを取得するように設定されています。また、処理後は、ここに戻します。
16.4. Java 出力設定 リンクのコピーリンクがクリップボードにコピーされました!
- メッセージを Java オブジェクトに変換するには、
Transform_XML2POJOクイックスタートの例を確認してください。 - 構成された Java オブジェクトモデルをモデルドリブンの変換の一部として使用します。パイプラインで SmooksAction の後に続く他の ESB アクションインスタンスで、それらを使用できるようにすることもできます。このような Java オブジェクトグラフは、このアクションによって出力された ESB メッセージに添付され、後続のアクションに入力されるため、後続のパイプラインアクションインスタンスで使用できます。
- Smooks Java Bean 設定に定義されているように、beanId オブジェクトに直接基づくキーの下で、
Message.getBody().add(...)を使用して、オブジェクトを ESB メッセージ出力に添付します。つまり、オブジェクトは、Body.get(beanId)呼び出しを実行すると、ESB メッセージ本文で利用できます。 - また、java-output-location プロパティーを追加すると、出力メッセージに完全な Java オブジェクトマップを添付できます。
<action name="transform" class="org.jboss.soa.esb.actions.converters.SmooksTransformer"> <property name="resource-config" value="/smooks-config.xml" ></property> <property name="java-output-location" value="order-message-objects-map" ></property> </action><action name="transform" class="org.jboss.soa.esb.actions.converters.SmooksTransformer"> <property name="resource-config" value="/smooks-config.xml" ></property> <property name="java-output-location" value="order-message-objects-map" ></property> </action>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - これはマップを Default Message Body Location にバインドするための簡単な方法です。
<action name="transform" class="org.jboss.soa.esb.actions.converters.SmooksTransformer"> <property name="resource-config" value="/smooks-config.xml" ></property> <property name="java-output-location" value="$default" ></property> </action><action name="transform" class="org.jboss.soa.esb.actions.converters.SmooksTransformer"> <property name="resource-config" value="/smooks-config.xml" ></property> <property name="java-output-location" value="$default" ></property> </action>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
16.5. プロファイルベースの変換 リンクのコピーリンクがクリップボードにコピーされました!
- プロファイルベースの変換を実行するには、次の例を参照してください。1 つの変換設定ファイル (
smooks-config.xml) を定義する必要があります。メッセージは、3 つの異なるソースと 1 つのターゲット宛先の間で交換されています。ESB は、宛先サービスに送信する前に、3 つの異なるソースのそれぞれから (異なる形式で) 提供されたメッセージを Java オブジェクトに変換する必要があります。ESB の観点から見ると、宛先には、1 つのサービス設定があります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - ソースごとに 1 つずつ、3 つの異なる変換を定義します。これは、Smooks Message Profiling を使用すると、実行されます。
- 定義を 3 つの Smooks 設定ファイル (
from_source1.xml、from_source2.xml、およびfrom_source3.xml) に保存します。 - 上記の各ファイルで、その設定セットに default-target-profile を指定します。
<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.0.xsd" default-target-profile="from:source1"> <!-- Source1 to Target Java message transformation resource configurations... --> </smooks-resource-list><smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.0.xsd" default-target-profile="from:source1"> <!-- Source1 to Target Java message transformation resource configurations... --> </smooks-resource-list>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - これらのファイルをトップレベルの
smooks-config.xmlに追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow これで、3 つの異なる変換を持つ 1 つの SmooksAction インスタンスをロードするように、システムが設定されました。それぞれが独自の一意のプロファイル名で定義されています。 - SmooksAction が与えられたメッセージに 3 つの変換のうちどれを適用するかを知るには、メッセージが SmooksAction に流入する前に、メッセージの from プロパティを設定する必要があります。これは、ソース自体で行うことも、SmooksAction の前にあるコンテンツベースのアクションで行うこともできます。注記JBoss Enterprise SOA Platform は、from、つまり、from-type、to、および to-type 以外に、他のプロファイルもサポートします。これらを組み合わせて使用すると、より複雑な交換ベースの変換を行うことができます。
16.6. Transform_XML2POJO2 リンクのコピーリンクがクリップボードにコピーされました!
/samples/quickstarts/transform_XML2POJO2/ と呼ばれるクイックスタートとして実装できます。このクイックスタートには、2 つのメッセージソースがあります。クイックスタートは、受信メッセージの from プロファイルを検出および設定するアクションパイプライン上で、Groovy スクリプトを実行します。
16.7. Transform_XML2POJO2 ファイル リンクのコピーリンクがクリップボードにコピーされました!
jboss-esb.xml: これは JBoss ESB 設定ファイルです。smooks-config.xml: このファイルには、トップレベルの変換設定が含まれます。from-dvdstore.xml: これには、トップレベルのsmooks-config.xmlファイルにインポートされる DVD ストアメッセージ変換設定が含まれます。(プロファイル設定をメモします。) これは、DVD ストアメッセージを Java オブジェクトに変換するように設計された設定です。from-petstore.xml: このファイルには、トップレベルのsmooks-config.xmlファイルにインポートされる Pet Store メッセージ変換設定が含まれます。(プロファイル設定をメモします。) これは、DVD ストアメッセージを Java オブジェクトに変換するように設計された設定です。check-origin.groovy: これは、内容に基づいて、各メッセージの送信元を判別する単純な Groovy スクリプトです。
付録A 更新履歴 リンクのコピーリンクがクリップボードにコピーされました!
| 改訂履歴 | |||
|---|---|---|---|
| 改訂 5.3.1-79.400 | 2013-10-31 | ||
| |||
| 改訂 5.3.1-79 | Wed Feb 06 2013 | ||
| |||