作成されたアノテーションにより、モデルのさまざまな概念を次のように POJO にマップできます。
レコードのタイプ(CSV、キーと値のペア(FIX メッセージなど)、固定長 …)
リンク (別のオブジェクトにあるオブジェクトをリンクする)、
DataField とそのプロパティー (int、type、…)、
KeyValuePairField (FIX 財務メッセージにあるようなキー = 値形式の場合)、
セクション (ヘッダー、本文、およびフッターセクションを識別する)、
OneToMany,
BindyConverter,
FormatFactories
このセクションでは、上記について説明します。
CsvRecord アノテーションは、モデルのルートクラスを識別するために使用されます。レコード = CSV ファイルの 1 行を表し、複数の子モデルクラスにリンクできます。
Expand アノテーション名 レコードの種類 レベル
CsvRecord
CSV
クラス
Show more Expand パラメーター名 タイプ 必須 デフォルト値 Info
separator
String
✓
トークンでレコードを分割するために使用される区切り記号 (必須): ',' または ';'、'anything' にすることができます。サポートされている唯一の空白文字はタブ (\t) です。その他の空白文字 (スペース) はサポートされていません。この値は正規表現として解釈されます。正規表現で特別な意味を持つ記号を使用する場合は、'|' の記号であれば、'|' のようにマスクする必要があります。
allowEmptyStream
boolean
false
allowEmptyStream パラメーターは、利用できないストリームを CSV ファイル向けに処理できるようにします。
autospanLine
boolean
false
Last record spans rest of line (オプション): 有効にすると、コメントなどの場合に、最後の列が自動的に行末に広がります。この設定により、その行にすべての文字と区切り文字を含めることができます。
crlf
String
WINDOWS
Character to be used to add a carriage return after each record (オプション): 使用するキャリッジリターン文字を定義できます。上記の 3 つ以外の値を指定すると、入力した値 (カスタム) が CRLF 文字として使用されます。WINDOWS、UNIX、MAC、またはカスタムの 3 つの値を使用できます。
endWithLineBreak
boolean
true
endWithLineBreak パラメーターは、CSV ファイルが改行で終了するかどうかを示します (オプション)
generateHeaderColumns
boolean
false
generateHeaderColumns パラメーターを使用すると、列の名前を含むヘッダーを生成した CSV に追加できます
isOrdered
boolean
false
出力でメッセージを並べ替える必要があるかどうかを示します
name
String
レコードを説明する名前 (オプション)
quote
String
"
指定された引用文字で列をマーシャリングするかどうか (オプション): CSV の生成時にフィールドの引用文字を指定できるようにします。このアノテーションは、モデルのルートクラスに関連付けられており、一度宣言する必要があります。
引用
boolean
false
マーシャリング時に値 (およびヘッダー) を引用符で囲む必要があるかどうかを示します (オプション)
quotingEscaped
boolean
false
引用時に値をエスケープする必要があるかどうかを示します (オプション)
removeQuotes
boolean
true
remove quotes パラメーターフラグ。アンマーシャリングで各フィールドの引用符を削除しようとするかどうか。
skipField
boolean
false
skipField パラメーターを使用すると、CSV ファイルのフィールドをスキップできます。一部のフィールドが不要な場合は、スキップできます。
skipFirstLine
boolean
false
skipFirstLine パラメーターを使用すると、CSV ファイルの最初の行をスキップするかどうかを指定できます。この行には、多くの場合、列の定義が含まれています
Show more
ケース 1: separator = ','
CSV レコード内のフィールド分離に使用されるセパレーターは ,
です。
10, J, Pauline, M, XD12345678, Fortis Dynamic 15/15, 2500, USD, 08-01-2009
10, J, Pauline, M, XD12345678, Fortis Dynamic 15/15, 2500, USD, 08-01-2009
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
@CsvRecord( separator = "," )
public Class Order {
}
@CsvRecord( separator = "," )
public Class Order {
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 2: separator = ';'
前のケースと比較して、ここでのセパレーターは ,
の代わり ;
を使用しています。
10; J; Pauline; M; XD12345678; Fortis Dynamic 15/15; 2500; USD; 08-01-2009
10; J; Pauline; M; XD12345678; Fortis Dynamic 15/15; 2500; USD; 08-01-2009
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
@CsvRecord( separator = ";" )
public Class Order {
}
@CsvRecord( separator = ";" )
public Class Order {
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 3: separator = '|'
前のケースと比較して、ここでのセパレーターは ;
の代わり |
を使用しています。
10| J| Pauline| M| XD12345678| Fortis Dynamic 15/15| 2500| USD| 08-01-2009
10| J| Pauline| M| XD12345678| Fortis Dynamic 15/15| 2500| USD| 08-01-2009
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
@CsvRecord( separator = "\\|" )
public Class Order {
}
@CsvRecord( separator = "\\|" )
public Class Order {
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 4: separator = '\",\"'
Camel 2.8.2 以前に該当
CSV レコードの解析対象フィールドに ,
または ;
が含まれる場合。これはセパレーターとしても使用されるため、Camel バインドにこのケースの処理方法を伝える別のストラテジーを見つける必要があります。データを含むフィールドをコンマで定義するには、一重引用符または二重引用符を区切り文字として使用します (例: '10', 'Street 10, NY', 'USA' or "10", "Street 10, NY", "USA")。
Expand
__
この場合、行頭または行末にある一重引用符または二重引用符の文字は bindy によって削除されます。
Show more
"10","J","Pauline"," M","XD12345678","Fortis Dynamic 15,15","2500","USD","08-01-2009"
"10","J","Pauline"," M","XD12345678","Fortis Dynamic 15,15","2500","USD","08-01-2009"
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
@CsvRecord( separator = "\",\"" )
public Class Order {
}
@CsvRecord( separator = "\",\"" )
public Class Order {
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
Bindy は、レコードが一重引用符または二重引用符で囲まれているかどうかを自動的に検出し、CSV からオブジェクトへのアンマーシャリング時にそれらの引用符を自動的に削除します。したがって、セパレーターに引用符を 含めず に、単に以下を実行するだけです。
"10","J","Pauline"," M","XD12345678","Fortis Dynamic 15,15","2500","USD","08-01-2009"
"10","J","Pauline"," M","XD12345678","Fortis Dynamic 15,15","2500","USD","08-01-2009"
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
@CsvRecord( separator = "," )
public Class Order {
}
@CsvRecord( separator = "," )
public Class Order {
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
Object から CSV にマーシャリングして引用符を使用する場合は、以下に示すように @CsvRecord
の quote
属性を使用して、使用する引用符を指定する必要があることに注意してください。
@CsvRecord( separator = ",", quote = "\"" )
public Class Order {
}
@CsvRecord( separator = ",", quote = "\"" )
public Class Order {
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 5: separator & skipFirstLine
この機能は、クライアントがファイルの最初の行にデータフィールドの名前を入れる場合に役立ちます。
order id, client id, first name, last name, isin code, instrument name, quantity, currency, date
order id, client id, first name, last name, isin code, instrument name, quantity, currency, date
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
解析プロセス中にこの最初の行をスキップする必要があることを bindy に通知するには、次の属性を使用します。
@CsvRecord(separator = ",", skipFirstLine = true)
public Class Order {
}
@CsvRecord(separator = ",", skipFirstLine = true)
public Class Order {
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 6: generateHeaderColumns
生成された CSV の最初の行に追加するには、次のようにアノテーションで属性 generateHeaderColumns を true に設定する必要があります。
@CsvRecord( generateHeaderColumns = true )
public Class Order {
}
@CsvRecord( generateHeaderColumns = true )
public Class Order {
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
その結果、アンマーシャリングプロセス中の Bindy は、次のような CSV を生成します。
order id, client id, first name, last name, isin code, instrument name, quantity, currency, date
10, J, Pauline, M, XD12345678, Fortis Dynamic 15/15, 2500, USD, 08-01-2009
order id, client id, first name, last name, isin code, instrument name, quantity, currency, date
10, J, Pauline, M, XD12345678, Fortis Dynamic 15/15, 2500, USD, 08-01-2009
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 7: carriage return
camel-bindy が実行されるプラットフォームが Windows ではなく、Macintosh または Unix である場合には、次のように crlf プロパティーを変更できます。WINDOWS、UNIX、または MAC の 3 つの値を使用できます。
@CsvRecord(separator = ",", crlf="MAC")
public Class Order {
}
@CsvRecord(separator = ",", crlf="MAC")
public Class Order {
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
さらに、何らかの理由で別の行末文字を追加する必要がある場合は、crlf パラメーターを使用して指定できます。次の例では、コンマとそれに続く改行文字で行を終了できます。
@CsvRecord(separator = ",", crlf=",\n")
public Class Order {
}
@CsvRecord(separator = ",", crlf=",\n")
public Class Order {
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 8: isOrdered
モデルから CSV レコードを作成する際に従う順序が、解析時に使用される順序と異なる場合があります。次に、この場合、属性 isOrdered = true
を使用して、DataField アノテーションの属性 position
と組み合わせて指定できます。
@CsvRecord(isOrdered = true)
public Class Order {
@DataField(pos = 1, position = 11)
private int orderNr;
@DataField(pos = 2, position = 10)
private String clientNr;
}
@CsvRecord(isOrdered = true)
public Class Order {
@DataField(pos = 1, position = 11)
private int orderNr;
@DataField(pos = 2, position = 10)
private String clientNr;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
Expand
__
pos
はファイルストリームの解析に、position
は CSV の生成に使用されます。
Show more
リンクアノテーションを使用すると、オブジェクトを相互にリンクできます。
Expand アノテーション名 レコードの種類 レベル
リンク
all
クラスとプロパティー
Show more Expand パラメーター名 タイプ 必須 デフォルト値 Info
linkType
LinkType
OneToOne
クラス間の関係を識別するリンクのタイプ
Show more
現在のバージョンでは、1 対 1 の関係のみが許可されています。
例: モデルクラス Client が Order クラスにリンクされている場合には、次のように Order クラスでアノテーション Link を使用します。
プロパティーリンク
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@Link
private Client client;
}
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@Link
private Client client;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
クラス Client の場合:
クラスリンク
@Link
public class Client {
}
@Link
public class Client {
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
DataField アノテーションは、フィールドのプロパティーを定義します。各データフィールドは、レコード内の位置、タイプ(文字列、int、日付など)、およびオプションでパターンで識別されます。
Expand アノテーション名 レコードの種類 レベル
DataField
all
プロパティー
Show more Expand パラメーター名 タイプ 必須 デフォルト値 Info
pos
int
✓
入力レコード内のデータの位置。1 から開始する必要があります (必須)。位置パラメーターを参照してください。
align
String
R
テキストを右または左に揃えます。値 <tt>R</tt> または <tt>L</tt> を使用します。
clip
boolean
false
固定長の使用時に許容される長さを超える場合は、フィールド内のデータを切り取ることを示します。
columnName
String
ヘッダー列の名前 (オプション)。プロパティーの名前をデフォルトとして使用します。CsvRecord
が generateHeaderColumns = true
の場合にのみ適用可能
decimalSeparator
String
BigDecimal 数値で使用する小数点区切り記号
defaultValue
String
値が設定されていない場合のフィールドのデフォルト値
delimiter
String
フィールドが可変長の場合に使用するオプションの区切り文字
groupingSeparator
String
123,456.789 などのグループ化された数値にフォーマット/解析する場合に、BigDecimal 数値と併用するグループ化セパレーター。
impliedDecimalSeparator
boolean
false
指定された位置に暗黙の小数点があるかどうかを示します
長さ
int
0
レコードが固定長に設定されている場合のデータブロックの長さ (文字数)
lengthPos
int
0
このフィールドで必要とされる固定長を定義するレコードのデータフィールドを識別します
メソッド
String
このようなカスタマイズを DataField に適用するために呼び出すメソッド名。これは、データフィールド自体のメソッドである必要があります。そうでない場合には、クラスのメソッドの静的な完全修飾名を指定する必要があります。(例: org.apache.camel.dataformat.bindy.csv.BindySimpleCsvFunctionWithExternalMethodTest.replaceToBar の単体テストを参照)
name
String
フィールドの名前 (オプション)
paddingChar
char
レコードが固定長に設定されている場合に埋め込む文字
pattern
String
Java フォーマッター (例: SimpleDateFormat) がデータの変換に使用するパターン (オプション)。パターンを使用する場合は、バインドデータ形式にロケールを設定することをお勧めします。us などの既知のロケールに設定するか、default を使用してプラットフォームのデフォルトロケールを使用します。
position
int
0
生成された出力メッセージ内のフィールドの位置 (1 から開始する必要があります)。生成された CSV 内のフィールドの位置 (出力メッセージ) が、入力位置 (pos) と比較して異なる必要がある場合に使用します。pos パラメーターを参照してください。
精度
int
0
作成される \{@link java.math.BigDecimal} 数値の精度
必須
boolean
false
フィールドが必須かどうかを示します
rounding
String
CEILING
BigDecimal の丸め/スケーリングに使用される丸めモード 値: UP、DOWN、CEILING、FLOOR、HALF_UP、HALF_DOWN、HALF_EVEN、UNNECESSARY (例: Number = 123456.789, Precision = 2, Rounding = CEILING Result : 123456.79)
timezone
String
使用するタイムゾーン。
trim
boolean
false
値をトリミングする必要があるかどうかを示します
Show more
ケース 1: pos
このパラメーター/属性は、CSV レコード内のフィールドの位置を表します。
Position
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 5)
private String isinCode;
}
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 5)
private String isinCode;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
この例でわかるように、位置は 1
から始まりますが、クラス Order では続きは 5
になります。2
から 4
までの数字はクラス Client で定義されています (以下を参照)。
位置は別のモデルクラスで継続する
public class Client {
@DataField(pos = 2)
private String clientNr;
@DataField(pos = 3)
private String firstName;
@DataField(pos = 4)
private String lastName;
}
public class Client {
@DataField(pos = 2)
private String clientNr;
@DataField(pos = 3)
private String firstName;
@DataField(pos = 4)
private String lastName;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 2: pattern
パターンを使用すると、データの形式を強化または検証できます
Pattern
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 5)
private String isinCode;
@DataField(name = "Name", pos = 6)
private String instrumentName;
@DataField(pos = 7, precision = 2)
private BigDecimal amount;
@DataField(pos = 8)
private String currency;
// pattern used during parsing or when the date is created
@DataField(pos = 9, pattern = "dd-MM-yyyy")
private Date orderDate;
}
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 5)
private String isinCode;
@DataField(name = "Name", pos = 6)
private String instrumentName;
@DataField(pos = 7, precision = 2)
private BigDecimal amount;
@DataField(pos = 8)
private String currency;
// pattern used during parsing or when the date is created
@DataField(pos = 9, pattern = "dd-MM-yyyy")
private Date orderDate;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 3: precision
精度は、数値の小数部分を定義する場合に役立ちます。
精度
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@Link
private Client client;
@DataField(pos = 5)
private String isinCode;
@DataField(name = "Name", pos = 6)
private String instrumentName;
@DataField(pos = 7, precision = 2)
private BigDecimal amount;
@DataField(pos = 8)
private String currency;
@DataField(pos = 9, pattern = "dd-MM-yyyy")
private Date orderDate;
}
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@Link
private Client client;
@DataField(pos = 5)
private String isinCode;
@DataField(name = "Name", pos = 6)
private String instrumentName;
@DataField(pos = 7, precision = 2)
private BigDecimal amount;
@DataField(pos = 8)
private String currency;
@DataField(pos = 9, pattern = "dd-MM-yyyy")
private Date orderDate;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 4: 出力で位置が異なる
position 属性は、生成された CSV レコードにフィールドを配置する方法を bindy に通知します。デフォルトでは、使用される位置は属性 pos
で定義された位置に対応します。位置が異なる場合 (つまり、マーシャリングとアンマーシャリングを比較する非対称プロセスがあることを意味します)、position
を使用してこれを指定できます。
以下に例を示します。
出力位置が異なる
@CsvRecord(separator = ",", isOrdered = true)
public class Order {
// Positions of the fields start from 1 and not from 0
@DataField(pos = 1, position = 11)
private int orderNr;
@DataField(pos = 2, position = 10)
private String clientNr;
@DataField(pos = 3, position = 9)
private String firstName;
@DataField(pos = 4, position = 8)
private String lastName;
@DataField(pos = 5, position = 7)
private String instrumentCode;
@DataField(pos = 6, position = 6)
private String instrumentNumber;
}
@CsvRecord(separator = ",", isOrdered = true)
public class Order {
// Positions of the fields start from 1 and not from 0
@DataField(pos = 1, position = 11)
private int orderNr;
@DataField(pos = 2, position = 10)
private String clientNr;
@DataField(pos = 3, position = 9)
private String firstName;
@DataField(pos = 4, position = 8)
private String lastName;
@DataField(pos = 5, position = 7)
private String instrumentCode;
@DataField(pos = 6, position = 6)
private String instrumentNumber;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
アノテーション @DataField
のこの属性は、アノテーション @CsvRecord
の属性 isOrdered = true
と組み合わせて使用する必要があります。
ケース 5: 必須
フィールドが必須の場合は、required
属性を true に設定して使用します。
必須
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 2, required = true)
private String clientNr;
@DataField(pos = 3, required = true)
private String firstName;
@DataField(pos = 4, required = true)
private String lastName;
}
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 2, required = true)
private String clientNr;
@DataField(pos = 3, required = true)
private String firstName;
@DataField(pos = 4, required = true)
private String lastName;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
このフィールドがレコードに存在しない場合には、パーサーにより次の情報を含めてエラーが報告されます。
Some fields are missing (optional or mandatory), line :
Some fields are missing (optional or mandatory), line :
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 6: trim
フィールドの先頭および/または末尾にスペースがあり、処理する前に削除する必要がある場合は、trim
属性を true に設定してください。
Trim
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1, trim = true)
private int orderNr;
@DataField(pos = 2, trim = true)
private Integer clientNr;
@DataField(pos = 3, required = true)
private String firstName;
@DataField(pos = 4)
private String lastName;
}
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1, trim = true)
private int orderNr;
@DataField(pos = 2, trim = true)
private Integer clientNr;
@DataField(pos = 3, required = true)
private String firstName;
@DataField(pos = 4)
private String lastName;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 7: defaultValue
フィールドが定義されていない場合は、defaultValue
属性で示される値が使用されます。
デフォルト値
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 2)
private Integer clientNr;
@DataField(pos = 3, required = true)
private String firstName;
@DataField(pos = 4, defaultValue = "Barin")
private String lastName;
}
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 2)
private Integer clientNr;
@DataField(pos = 3, required = true)
private String firstName;
@DataField(pos = 4, defaultValue = "Barin")
private String lastName;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 8: columnName
@CsvRecord
にアノテーション generateHeaderColumns = true
がある場合にのみ、プロパティーの列名を指定します。
列名
@CsvRecord(separator = ",", generateHeaderColumns = true)
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 5, columnName = "ISIN")
private String isinCode;
@DataField(name = "Name", pos = 6)
private String instrumentName;
}
@CsvRecord(separator = ",", generateHeaderColumns = true)
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 5, columnName = "ISIN")
private String isinCode;
@DataField(name = "Name", pos = 6)
private String instrumentName;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
この属性は、オプションのフィールドにのみ適用されます。
FixedLengthRecord アノテーションは、モデルのルートクラスを識別するために使用されます。これは、レコード = 固定長 (文字数) でフォーマットされたデータを含むファイル/メッセージの行を表し、複数の子モデルクラスにリンクできます。フィールドのデータは右または左に位置合わせできるため、この形式は少し特殊です。
データのサイズがフィールドの長さを完全に満たしていない場合は、埋め込み文字を追加できます。
Expand アノテーション名 レコードの種類 レベル
FixedLengthRecord
固定:
クラス
Show more Expand パラメーター名 タイプ 必須 デフォルト値 Info
countGrapheme
boolean
false
文字数のカウント方法を示します
crlf
String
WINDOWS
各レコードの後に改行を追加するために使用する文字 (オプション)。使用可能な値: WINDOWS、UNIX、MAC、またはカスタム。このオプションはマーシャリング中にのみ使用されますが、アンマーシャリングでは、eol がカスタマイズされていない限り、JDK が提供するシステムのデフォルトの行区切り文字が使用されます。
eol
String
アンマーシャリング中に各レコードの後ろの行末を考慮する処理に使用される文字 (オプション、デフォルト: "" で、他の行区切り文字が指定されていない場合にデフォルトの JDK が提供する行区切り文字を使用できるようにします)。このオプションは、アンマーシャリング中にのみ使用されます。他の値が指定されていない限り、マーシャリング時に "WINDOWS" として、システムのデフォルトで提供される行区切り文字を使用します。
footer
クラス
void
このタイプのレコードでは、ファイルの最後に単一のフッターレコードが続く可能性があることを指定します。
header
クラス
void
このタイプのレコードでは、ファイルの先頭に単一のヘッダーレコードがある可能性があることを指定します。
ignoreMissingChars
boolean
false
短すぎる行を無視するかどうかを示します
ignoreTrailingChars
boolean
false
アンマーシャリング/解析時に、最後にマップされたフィールドを超える文字を無視できることを示します。このアノテーションは、モデルのルートクラスに関連付けられており、一度宣言する必要があります。
長さ
int
0
レコードの固定長 (文字数)。これは、レコードが常に \{#paddingChar ()} でパディングされることを意味します
name
String
レコードを説明する名前 (オプション)
paddingChar
char
パディングする文字。
skipFooter
boolean
false
フッターレコードのマーシャリング/アンマーシャリングをスキップするようにデータ形式を設定します。プライマリーレコードでこのパラメーターを設定します (たとえば、ヘッダーやフッターではありません)。
skipHeader
boolean
false
ヘッダーレコードのマーシャリング/アンマーシャリングをスキップするようにデータ形式を設定します。プライマリーレコードでこのパラメーターを設定します (たとえば、ヘッダーやフッターではありません)。
Show more
レコードは、ヘッダー/フッターと、プライマリーの固定長レコードを両方に指定できません。
ケース 1: 単純な固定長レコード
この単純な例は、固定メッセージを解析/フォーマットするモデル設計方法を示しています
10A9PaulineMISINXD12345678BUYShare2500.45USD01-08-2009
10A9PaulineMISINXD12345678BUYShare2500.45USD01-08-2009
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
Fixed-simple
@FixedLengthRecord(length=54, paddingChar=' ')
public static class Order {
@DataField(pos = 1, length=2)
private int orderNr;
@DataField(pos = 3, length=2)
private String clientNr;
@DataField(pos = 5, length=7)
private String firstName;
@DataField(pos = 12, length=1, align="L")
private String lastName;
@DataField(pos = 13, length=4)
private String instrumentCode;
@DataField(pos = 17, length=10)
private String instrumentNumber;
@DataField(pos = 27, length=3)
private String orderType;
@DataField(pos = 30, length=5)
private String instrumentType;
@DataField(pos = 35, precision = 2, length=7)
private BigDecimal amount;
@DataField(pos = 42, length=3)
private String currency;
@DataField(pos = 45, length=10, pattern = "dd-MM-yyyy")
private Date orderDate;
}
@FixedLengthRecord(length=54, paddingChar=' ')
public static class Order {
@DataField(pos = 1, length=2)
private int orderNr;
@DataField(pos = 3, length=2)
private String clientNr;
@DataField(pos = 5, length=7)
private String firstName;
@DataField(pos = 12, length=1, align="L")
private String lastName;
@DataField(pos = 13, length=4)
private String instrumentCode;
@DataField(pos = 17, length=10)
private String instrumentNumber;
@DataField(pos = 27, length=3)
private String orderType;
@DataField(pos = 30, length=5)
private String instrumentType;
@DataField(pos = 35, precision = 2, length=7)
private BigDecimal amount;
@DataField(pos = 42, length=3)
private String currency;
@DataField(pos = 45, length=10, pattern = "dd-MM-yyyy")
private Date orderDate;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 2: アラインメントとパディングのある固定長レコード
こちらの詳細な例は、フィールドの配置を定義する方法と、ここで ' '
であるパディング文字を割り当てる方法を示しています。
10A9 PaulineM ISINXD12345678BUYShare2500.45USD01-08-2009
10A9 PaulineM ISINXD12345678BUYShare2500.45USD01-08-2009
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
Fixed-padding-align
@FixedLengthRecord(length=60, paddingChar=' ')
public static class Order {
@DataField(pos = 1, length=2)
private int orderNr;
@DataField(pos = 3, length=2)
private String clientNr;
@DataField(pos = 5, length=9)
private String firstName;
@DataField(pos = 14, length=5, align="L") // align text to the LEFT zone of the block
private String lastName;
@DataField(pos = 19, length=4)
private String instrumentCode;
@DataField(pos = 23, length=10)
private String instrumentNumber;
@DataField(pos = 33, length=3)
private String orderType;
@DataField(pos = 36, length=5)
private String instrumentType;
@DataField(pos = 41, precision = 2, length=7)
private BigDecimal amount;
@DataField(pos = 48, length=3)
private String currency;
@DataField(pos = 51, length=10, pattern = "dd-MM-yyyy")
private Date orderDate;
}
@FixedLengthRecord(length=60, paddingChar=' ')
public static class Order {
@DataField(pos = 1, length=2)
private int orderNr;
@DataField(pos = 3, length=2)
private String clientNr;
@DataField(pos = 5, length=9)
private String firstName;
@DataField(pos = 14, length=5, align="L") // align text to the LEFT zone of the block
private String lastName;
@DataField(pos = 19, length=4)
private String instrumentCode;
@DataField(pos = 23, length=10)
private String instrumentNumber;
@DataField(pos = 33, length=3)
private String orderType;
@DataField(pos = 36, length=5)
private String instrumentType;
@DataField(pos = 41, precision = 2, length=7)
private BigDecimal amount;
@DataField(pos = 48, length=3)
private String currency;
@DataField(pos = 51, length=10, pattern = "dd-MM-yyyy")
private Date orderDate;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 3: フィールドパディング
' ' の代わりに '0' をパディングする数値形式があるため、レコードに定義されたデフォルトのパディングをフィールドに適用できない場合があります。この場合、モデルで @DataField
の属性 paddingChar
を使用して、この値を設定できます。
10A9 PaulineM ISINXD12345678BUYShare000002500.45USD01-08-2009
10A9 PaulineM ISINXD12345678BUYShare000002500.45USD01-08-2009
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
Fixed-padding-field
@FixedLengthRecord(length = 65, paddingChar = ' ')
public static class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 3, length = 2)
private String clientNr;
@DataField(pos = 5, length = 9)
private String firstName;
@DataField(pos = 14, length = 5, align = "L")
private String lastName;
@DataField(pos = 19, length = 4)
private String instrumentCode;
@DataField(pos = 23, length = 10)
private String instrumentNumber;
@DataField(pos = 33, length = 3)
private String orderType;
@DataField(pos = 36, length = 5)
private String instrumentType;
@DataField(pos = 41, precision = 2, length = 12, paddingChar = '0')
private BigDecimal amount;
@DataField(pos = 53, length = 3)
private String currency;
@DataField(pos = 56, length = 10, pattern = "dd-MM-yyyy")
private Date orderDate;
}
@FixedLengthRecord(length = 65, paddingChar = ' ')
public static class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 3, length = 2)
private String clientNr;
@DataField(pos = 5, length = 9)
private String firstName;
@DataField(pos = 14, length = 5, align = "L")
private String lastName;
@DataField(pos = 19, length = 4)
private String instrumentCode;
@DataField(pos = 23, length = 10)
private String instrumentNumber;
@DataField(pos = 33, length = 3)
private String orderType;
@DataField(pos = 36, length = 5)
private String instrumentType;
@DataField(pos = 41, precision = 2, length = 12, paddingChar = '0')
private BigDecimal amount;
@DataField(pos = 53, length = 3)
private String currency;
@DataField(pos = 56, length = 10, pattern = "dd-MM-yyyy")
private Date orderDate;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 4: 区切り文字付きの固定長レコード
固定長レコードでは、レコード内のコンテンツが区切られている場合があります。次の例では、firstName フィールドと lastName フィールドが ^
文字で区切られています。
10A9Pauline^M^ISINXD12345678BUYShare000002500.45USD01-08-2009
10A9Pauline^M^ISINXD12345678BUYShare000002500.45USD01-08-2009
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
Fixed-delimited
@FixedLengthRecord
public static class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 2, length = 2)
private String clientNr;
@DataField(pos = 3, delimiter = "^")
private String firstName;
@DataField(pos = 4, delimiter = "^")
private String lastName;
@DataField(pos = 5, length = 4)
private String instrumentCode;
@DataField(pos = 6, length = 10)
private String instrumentNumber;
@DataField(pos = 7, length = 3)
private String orderType;
@DataField(pos = 8, length = 5)
private String instrumentType;
@DataField(pos = 9, precision = 2, length = 12, paddingChar = '0')
private BigDecimal amount;
@DataField(pos = 10, length = 3)
private String currency;
@DataField(pos = 11, length = 10, pattern = "dd-MM-yyyy")
private Date orderDate;
}
@FixedLengthRecord
public static class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 2, length = 2)
private String clientNr;
@DataField(pos = 3, delimiter = "^")
private String firstName;
@DataField(pos = 4, delimiter = "^")
private String lastName;
@DataField(pos = 5, length = 4)
private String instrumentCode;
@DataField(pos = 6, length = 10)
private String instrumentNumber;
@DataField(pos = 7, length = 3)
private String orderType;
@DataField(pos = 8, length = 5)
private String instrumentType;
@DataField(pos = 9, precision = 2, length = 12, paddingChar = '0')
private BigDecimal amount;
@DataField(pos = 10, length = 3)
private String currency;
@DataField(pos = 11, length = 10, pattern = "dd-MM-yyyy")
private Date orderDate;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
固定長レコードの pos
値は、オプションで、正確な列番号の代わりに序数の連続した値を使用して定義できます。
ケース 5: レコード定義フィールド長の固定長レコード
固定長レコードには、同じレコード内の別のフィールドで必要とされる長さを定義するフィールドが含まれる場合があります。次の例では、instrumentNumber
フィールド値の長さは、レコード内の instrumentNumberLen
フィールドの値によって定義されます。
10A9Pauline^M^ISIN10XD12345678BUYShare000002500.45USD01-08-2009
10A9Pauline^M^ISIN10XD12345678BUYShare000002500.45USD01-08-2009
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
Fixed-delimited
@FixedLengthRecord
public static class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 2, length = 2)
private String clientNr;
@DataField(pos = 3, delimiter = "^")
private String firstName;
@DataField(pos = 4, delimiter = "^")
private String lastName;
@DataField(pos = 5, length = 4)
private String instrumentCode;
@DataField(pos = 6, length = 2, align = "R", paddingChar = '0')
private int instrumentNumberLen;
@DataField(pos = 7, lengthPos=6)
private String instrumentNumber;
@DataField(pos = 8, length = 3)
private String orderType;
@DataField(pos = 9, length = 5)
private String instrumentType;
@DataField(pos = 10, precision = 2, length = 12, paddingChar = '0')
private BigDecimal amount;
@DataField(pos = 11, length = 3)
private String currency;
@DataField(pos = 12, length = 10, pattern = "dd-MM-yyyy")
private Date orderDate;
}
@FixedLengthRecord
public static class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 2, length = 2)
private String clientNr;
@DataField(pos = 3, delimiter = "^")
private String firstName;
@DataField(pos = 4, delimiter = "^")
private String lastName;
@DataField(pos = 5, length = 4)
private String instrumentCode;
@DataField(pos = 6, length = 2, align = "R", paddingChar = '0')
private int instrumentNumberLen;
@DataField(pos = 7, lengthPos=6)
private String instrumentNumber;
@DataField(pos = 8, length = 3)
private String orderType;
@DataField(pos = 9, length = 5)
private String instrumentType;
@DataField(pos = 10, precision = 2, length = 12, paddingChar = '0')
private BigDecimal amount;
@DataField(pos = 11, length = 3)
private String currency;
@DataField(pos = 12, length = 10, pattern = "dd-MM-yyyy")
private Date orderDate;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 6: ヘッダーとフッター付きの固定長レコード
Bindy は、モデルの一部として設定されている固定長のヘッダーおよびフッターレコードを検出します。ただし、アノテーション付きのクラスが、プライマリー @FixedLengthRecord
クラスと同じパッケージに存在するか、設定されたスキャンパッケージの 1 つに含まれている必要があります。次のテキストは、ヘッダーレコードとフッターレコードで囲まれた 2 つの固定長レコードを示しています。
101-08-2009
10A9 PaulineM ISINXD12345678BUYShare000002500.45USD01-08-2009
10A9 RichN ISINXD12345678BUYShare000002700.45USD01-08-2009
9000000002
101-08-2009
10A9 PaulineM ISINXD12345678BUYShare000002500.45USD01-08-2009
10A9 RichN ISINXD12345678BUYShare000002700.45USD01-08-2009
9000000002
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
Fixed-header-and-footer-main-class
@FixedLengthRecord(header = OrderHeader.class, footer = OrderFooter.class)
public class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 2, length = 2)
private String clientNr;
@DataField(pos = 3, length = 9)
private String firstName;
@DataField(pos = 4, length = 5, align = "L")
private String lastName;
@DataField(pos = 5, length = 4)
private String instrumentCode;
@DataField(pos = 6, length = 10)
private String instrumentNumber;
@DataField(pos = 7, length = 3)
private String orderType;
@DataField(pos = 8, length = 5)
private String instrumentType;
@DataField(pos = 9, precision = 2, length = 12, paddingChar = '0')
private BigDecimal amount;
@DataField(pos = 10, length = 3)
private String currency;
@DataField(pos = 11, length = 10, pattern = "dd-MM-yyyy")
private Date orderDate;
}
@FixedLengthRecord
public class OrderHeader {
@DataField(pos = 1, length = 1)
private int recordType = 1;
@DataField(pos = 2, length = 10, pattern = "dd-MM-yyyy")
private Date recordDate;
}
@FixedLengthRecord
public class OrderFooter {
@DataField(pos = 1, length = 1)
private int recordType = 9;
@DataField(pos = 2, length = 9, align = "R", paddingChar = '0')
private int numberOfRecordsInTheFile;
}
@FixedLengthRecord(header = OrderHeader.class, footer = OrderFooter.class)
public class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 2, length = 2)
private String clientNr;
@DataField(pos = 3, length = 9)
private String firstName;
@DataField(pos = 4, length = 5, align = "L")
private String lastName;
@DataField(pos = 5, length = 4)
private String instrumentCode;
@DataField(pos = 6, length = 10)
private String instrumentNumber;
@DataField(pos = 7, length = 3)
private String orderType;
@DataField(pos = 8, length = 5)
private String instrumentType;
@DataField(pos = 9, precision = 2, length = 12, paddingChar = '0')
private BigDecimal amount;
@DataField(pos = 10, length = 3)
private String currency;
@DataField(pos = 11, length = 10, pattern = "dd-MM-yyyy")
private Date orderDate;
}
@FixedLengthRecord
public class OrderHeader {
@DataField(pos = 1, length = 1)
private int recordType = 1;
@DataField(pos = 2, length = 10, pattern = "dd-MM-yyyy")
private Date recordDate;
}
@FixedLengthRecord
public class OrderFooter {
@DataField(pos = 1, length = 1)
private int recordType = 9;
@DataField(pos = 2, length = 9, align = "R", paddingChar = '0')
private int numberOfRecordsInTheFile;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 7: 固定長レコードの解析時にコンテンツをスキップする
ターゲットユースケースに必要以上の情報を含む、固定長レコードを提供するシステムと統合するのが一般的です。この状況では、不要なフィールドの宣言と解析をスキップすると便利です。これに対応するために、次に宣言されたフィールドの pos
値が最後に解析されたフィールドのカーソル位置を超えている場合には、Bindy により、レコード内で次にマップされたフィールドに移動されます。対象のフィールドに (順序値ではなく) 絶対位置を使用すると、Bindy
は 2 つのフィールド間のコンテンツをスキップします。
同様に、先のフィールドに対象となるコンテンツがない場合があります。この場合には、@FixedLengthRecord
宣言で ignoreTrailingChars
プロパティーを設定して、最後にマップされたフィールド以降のすべての解析をスキップするように Bindy に指示できます。
@FixedLengthRecord(ignoreTrailingChars = true)
public static class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 3, length = 2)
private String clientNr;
// any characters that appear beyond the last mapped field will be ignored
}
@FixedLengthRecord(ignoreTrailingChars = true)
public static class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 3, length = 2)
private String clientNr;
// any characters that appear beyond the last mapped field will be ignored
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
Message アノテーションは、キーと値のペアフィールドを含むモデルのクラスを識別するために使用されます。この種の形式は、主に Financial Exchange Protocol Messages (FIX) で使用されます。いずれの場合も、このアノテーションは、データがキーによって識別される他の形式に使用できます。キーペアの値は、区切り記号で互いに区切られます。区切り文字には、タブ区切り記号 (Unicode 表現: \u0009
) または見出しの開始 (Unicode 表現: \u0001
) などの特殊文字を使用できます。
FIX メッセージを操作するには、モデルに、Order クラスである可能性があるルートメッセージクラスにリンクされた Header クラスと Trailer クラスが含まれている必要があります。これは必須ではありませんが、camel-bindy を、quickFix プロジェクトに基づく修正ゲートウェイである camel-fix と組み合わせて使用する場合に非常に役立ちます。
Expand アノテーション名 レコードの種類 レベル
メッセージ
キーと値のペア。
クラス
Show more Expand パラメーター名 タイプ 必須 デフォルト値 Info
keyValuePairSeparator
String
✓
キーと値のペアの区切り文字は、キーから値を分割するために使用されます (必須)。'\u0001'、'\u0009'、'#', または 'anything' を指定できます。
pairSeparator
String
✓
キーと値のペアをトークンに分割するために使用されるペアの区切り文字 (必須)。'='、';'、または 'anything' を指定できます。
crlf
String
WINDOWS
各レコードの後に改行を追加するために使用する文字 (オプション)。使用可能な値 = WINDOWS、UNIX、MAC、またはカスタム。上記の 3 つ以外の値を指定すると、入力した値 (カスタム) が CRLF 文字として使用されます。
isOrdered
boolean
false
出力でメッセージを並べ替える必要があるかどうかを示します。このアノテーションは、モデルのメッセージクラスに関連付けられており、一度宣言する必要があります。
name
String
メッセージを説明する名前 (オプション)
type
String
FIX
type は、メッセージのタイプを定義するために使用されます(FIX、EMX など) (オプション)。
version
String
4.1
version は、メッセージのバージョンを定義します(例:4.1, …)(オプション)
Show more
ケース 1: separator = 'u0001'
FIX メッセージでキーと値のペアフィールドを分離するために使用される区切り文字は、ASCII 01
文字または Unicode 形式の \u0001
です。Java ランタイムエラーを回避するには、この文字をもう一度エスケープする必要があります。以下は例です。
8=FIX.4.1 9=20 34=1 35=0 49=INVMGR 56=BRKR 1=BE.CHM.001 11=CHM0001-01 22=4 ...
8=FIX.4.1 9=20 34=1 35=0 49=INVMGR 56=BRKR 1=BE.CHM.001 11=CHM0001-01 22=4 ...
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
およびアノテーションの使用方法:
FIX - メッセージ
@Message(keyValuePairSeparator = "=", pairSeparator = "\u0001", type="FIX", version="4.1")
public class Order {
}
@Message(keyValuePairSeparator = "=", pairSeparator = "\u0001", type="FIX", version="4.1")
public class Order {
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
テストケースを見る
タブなどの ASCII 文字は、WIKI ページでは表示できません。したがって、camel-bindy のテストケースを見て、FIX メッセージ (https://github.com/apache/camel/blob/main/components/camel-bindy/src/test/data/fix/fix.txt ) および Order、Trailer、Header クラス (https://github.com/apache/camel/blob/main/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/model/fix/simple/Order.java ) が実際にどのように見えるかを確認してください。
KeyValuePairField アノテーションは、キーと値のペアフィールドのプロパティーを定義します。各 KeyValuePairField は、タグ(= キー)とそれに関連付けられた値、タイプ(文字列、int、日付など)、任意となるパターン、およびフィールドが必要な場合で識別されます。
Expand アノテーション名 レコードの種類 レベル
KeyValuePairField
キーと値のペア - FIX
プロパティー
Show more Expand パラメーター名 タイプ 必須 デフォルト値 Info
tag
int
✓
メッセージ内のフィールドを識別するタグ (必須) - 一意である必要があります
impliedDecimalSeparator
boolean
false
<b>Camel 2.11:</b> 指定された位置に暗黙の小数点があるかどうかを示します
name
String
フィールドの名前 (オプション)
pattern
String
フォーマッターがデータの変換に使用するパターン (オプション)
position
int
0
生成されたメッセージ内のフィールドの位置 - FIX メッセージ内のキー/タグの位置が異なる必要がある場合に使用する必要があります
精度
int
0
作成する BigDecimal 数値の精度
必須
boolean
false
フィールドが必須かどうかを示します
timezone
String
使用するタイムゾーン。
Show more
ケース 1: tag
このパラメーターは、メッセージ内のフィールドのキーを表します。
FIX メッセージ - タグ
@Message(keyValuePairSeparator = "=", pairSeparator = "\u0001", type="FIX", version="4.1")
public class Order {
@Link Header header;
@Link Trailer trailer;
@KeyValuePairField(tag = 1) // Client reference
private String Account;
@KeyValuePairField(tag = 11) // Order reference
private String ClOrdId;
@KeyValuePairField(tag = 22) // Fund ID type (Sedol, ISIN, ...)
private String IDSource;
@KeyValuePairField(tag = 48) // Fund code
private String SecurityId;
@KeyValuePairField(tag = 54) // Movement type ( 1 = Buy, 2 = sell)
private String Side;
@KeyValuePairField(tag = 58) // Free text
private String Text;
}
@Message(keyValuePairSeparator = "=", pairSeparator = "\u0001", type="FIX", version="4.1")
public class Order {
@Link Header header;
@Link Trailer trailer;
@KeyValuePairField(tag = 1) // Client reference
private String Account;
@KeyValuePairField(tag = 11) // Order reference
private String ClOrdId;
@KeyValuePairField(tag = 22) // Fund ID type (Sedol, ISIN, ...)
private String IDSource;
@KeyValuePairField(tag = 48) // Fund code
private String SecurityId;
@KeyValuePairField(tag = 54) // Movement type ( 1 = Buy, 2 = sell)
private String Side;
@KeyValuePairField(tag = 58) // Free text
private String Text;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 2: 出力での別の位置
FIX メッセージに入れるタグ/キーを事前定義された順序に従ってソートする必要がある場合は、アノテーション @KeyValuePairField
の属性 position
を使用します。
FIX メッセージ - タグ - 並べ替え
@Message(keyValuePairSeparator = "=", pairSeparator = "\\u0001", type = "FIX", version = "4.1", isOrdered = true)
public class Order {
@Link Header header;
@Link Trailer trailer;
@KeyValuePairField(tag = 1, position = 1) // Client reference
private String account;
@KeyValuePairField(tag = 11, position = 3) // Order reference
private String clOrdId;
}
@Message(keyValuePairSeparator = "=", pairSeparator = "\\u0001", type = "FIX", version = "4.1", isOrdered = true)
public class Order {
@Link Header header;
@Link Trailer trailer;
@KeyValuePairField(tag = 1, position = 1) // Client reference
private String account;
@KeyValuePairField(tag = 11, position = 3) // Order reference
private String clOrdId;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
固定長レコードの FIX メッセージでは、情報の表現にさまざまなセクション (ヘッダー、ボディ、およびセクション) があるのが一般的です。アノテーション @Section
の目的は、モデルのどのクラスがヘッダー (= セクション 1)、ボディ (= セクション 2)、およびフッター (= セクション 3) を表しているかを bindy に通知することです。
このアノテーションには、1 つの属性/パラメーターのみが存在します。
Expand アノテーション名 レコードの種類 レベル
セクション
FIX
クラス
Show more Expand パラメーター名 タイプ 必須 デフォルト値 Info
number
int
✓
セクション番号
Show more
ケース 1: セクション
ヘッダーセクションの定義:
FIX メッセージ - セクション - ヘッダー
@Section(number = 1)
public class Header {
@KeyValuePairField(tag = 8, position = 1) // Message Header
private String beginString;
@KeyValuePairField(tag = 9, position = 2) // Checksum
private int bodyLength;
}
@Section(number = 1)
public class Header {
@KeyValuePairField(tag = 8, position = 1) // Message Header
private String beginString;
@KeyValuePairField(tag = 9, position = 2) // Checksum
private int bodyLength;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
本文セクションの定義:
FIX メッセージ - セクション - 本文
@Section(number = 2)
@Message(keyValuePairSeparator = "=", pairSeparator = "\\u0001", type = "FIX", version = "4.1", isOrdered = true)
public class Order {
@Link Header header;
@Link Trailer trailer;
@KeyValuePairField(tag = 1, position = 1) // Client reference
private String account;
@KeyValuePairField(tag = 11, position = 3) // Order reference
private String clOrdId;
@Section(number = 2)
@Message(keyValuePairSeparator = "=", pairSeparator = "\\u0001", type = "FIX", version = "4.1", isOrdered = true)
public class Order {
@Link Header header;
@Link Trailer trailer;
@KeyValuePairField(tag = 1, position = 1) // Client reference
private String account;
@KeyValuePairField(tag = 11, position = 3) // Order reference
private String clOrdId;
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
フッターセクションの定義:
FIX メッセージ - セクション - フッター
@Section(number = 3)
public class Trailer {
@KeyValuePairField(tag = 10, position = 1)
// CheckSum
private int checkSum;
public int getCheckSum() {
return checkSum;
}
@Section(number = 3)
public class Trailer {
@KeyValuePairField(tag = 10, position = 1)
// CheckSum
private int checkSum;
public int getCheckSum() {
return checkSum;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
アノテーション @OneToMany
の目的は、POJO クラスで定義された List<?>
フィールドを操作できるようにすること、または反復グループを含むレコードから操作できるようにすることです。
OneToMany の制限事項 bindy の 1 対多では、複数レベルの階層で繰り返しが定義されている場合に処理できない点に注意してください。
OneToMany の関係は、次の場合にのみ機能します。
反復グループ (= タグ/キーのグループ) を含む FIX メッセージの読み取り
反復データを含む CSV の生成
Expand アノテーション名 レコードの種類 レベル
OneToMany
all
プロパティー
Show more Expand パラメーター名 タイプ 必須 デフォルト値 Info
mappedTo
String
List<Type of the Class> の型に関連付けられたクラス名
Show more
ケース 1: 反復データで CSV を生成する
必要な CSV 出力は次のとおりです。
Claus,Ibsen,Camel in Action 1,2010,35
Claus,Ibsen,Camel in Action 2,2012,35
Claus,Ibsen,Camel in Action 3,2013,35
Claus,Ibsen,Camel in Action 4,2014,35
Claus,Ibsen,Camel in Action 1,2010,35
Claus,Ibsen,Camel in Action 2,2012,35
Claus,Ibsen,Camel in Action 3,2013,35
Claus,Ibsen,Camel in Action 4,2014,35
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
反復データは書籍のタイトルとその発行日に関するものですが、姓名と年齢は一般的であり、これをモデル化するために使用されるクラスです。Author クラスには、書籍リストが含まれています。
反復データを含む CSV を生成する
@CsvRecord(separator=",")
public class Author {
@DataField(pos = 1)
private String firstName;
@DataField(pos = 2)
private String lastName;
@OneToMany
private List<Book> books;
@DataField(pos = 5)
private String Age;
}
public class Book {
@DataField(pos = 3)
private String title;
@DataField(pos = 4)
private String year;
}
@CsvRecord(separator=",")
public class Author {
@DataField(pos = 1)
private String firstName;
@DataField(pos = 2)
private String lastName;
@OneToMany
private List<Book> books;
@DataField(pos = 5)
private String Age;
}
public class Book {
@DataField(pos = 3)
private String title;
@DataField(pos = 4)
private String year;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ケース 2: タグ/キーのグループを含む FIX メッセージの読み取り
モデルで処理するメッセージは次のとおりです。
8=FIX 4.19=2034=135=049=INVMGR56=BRKR
1=BE.CHM.00111=CHM0001-0158=this is a camel - bindy test
22=448=BE000124567854=1
22=548=BE000987654354=2
22=648=BE000999999954=3
10=220
8=FIX 4.19=2034=135=049=INVMGR56=BRKR
1=BE.CHM.00111=CHM0001-0158=this is a camel - bindy test
22=448=BE000124567854=1
22=548=BE000987654354=2
22=648=BE000999999954=3
10=220
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
タグ 22、48、および 54 が繰り返されます。
およびコード:
タグ/キーのグループを含む FIX メッセージの読み取り
public class Order {
@Link Header header;
@Link Trailer trailer;
@KeyValuePairField(tag = 1) // Client reference
private String account;
@KeyValuePairField(tag = 11) // Order reference
private String clOrdId;
@KeyValuePairField(tag = 58) // Free text
private String text;
@OneToMany(mappedTo = "org.apache.camel.dataformat.bindy.model.fix.complex.onetomany.Security")
List<Security> securities;
}
public class Security {
@KeyValuePairField(tag = 22) // Fund ID type (Sedol, ISIN, ...)
private String idSource;
@KeyValuePairField(tag = 48) // Fund code
private String securityCode;
@KeyValuePairField(tag = 54) // Movement type ( 1 = Buy, 2 = sell)
private String side;
}
public class Order {
@Link Header header;
@Link Trailer trailer;
@KeyValuePairField(tag = 1) // Client reference
private String account;
@KeyValuePairField(tag = 11) // Order reference
private String clOrdId;
@KeyValuePairField(tag = 58) // Free text
private String text;
@OneToMany(mappedTo = "org.apache.camel.dataformat.bindy.model.fix.complex.onetomany.Security")
List<Security> securities;
}
public class Security {
@KeyValuePairField(tag = 22) // Fund ID type (Sedol, ISIN, ...)
private String idSource;
@KeyValuePairField(tag = 48) // Fund code
private String securityCode;
@KeyValuePairField(tag = 54) // Movement type ( 1 = Buy, 2 = sell)
private String side;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
アノテーション @BindyConverter
の目的は、フィールドレベルで使用されるコンバーターを定義することです。提供されたクラスは、Format インターフェイスを実装する必要があります。
@FixedLengthRecord(length = 10, paddingChar = ' ')
public static class DataModel {
@DataField(pos = 1, length = 10, trim = true)
@BindyConverter(CustomConverter.class)
public String field1;
}
public static class CustomConverter implements Format<String> {
@Override
public String format(String object) throws Exception {
return (new StringBuilder(object)).reverse().toString();
}
@Override
public String parse(String string) throws Exception {
return (new StringBuilder(string)).reverse().toString();
}
}
@FixedLengthRecord(length = 10, paddingChar = ' ')
public static class DataModel {
@DataField(pos = 1, length = 10, trim = true)
@BindyConverter(CustomConverter.class)
public String field1;
}
public static class CustomConverter implements Format<String> {
@Override
public String format(String object) throws Exception {
return (new StringBuilder(object)).reverse().toString();
}
@Override
public String parse(String string) throws Exception {
return (new StringBuilder(string)).reverse().toString();
}
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow