70.2. 주석
생성된 주석을 통해 모델의 다른 개념을 다음과 같이 매핑할 수 있습니다.
- 레코드 유형(CSV, 키 값 쌍(예: FIX 메시지), 고정 길이 …)
- link(다른 오브젝트의 링크)
- DataField 및 해당 속성(int, type, …)
- KeyValuePairField (FIX 재무 메시지에서와 같은 키 = 값 형식)
- 섹션(헤더, 본문 및 각자 섹션을 식별할 수 있음)
- OneToMany,
- BindyConverter,
- FormatFactories
이 섹션에서는 이러한 내용을 설명합니다.
70.2.1. 1. CsvRecord 링크 복사링크가 클립보드에 복사되었습니다!
CsvRecord 주석은 모델의 루트 클래스를 식별하는 데 사용됩니다. 레코드 = "csv 파일의 줄"을 나타내며 여러 하위 모델 클래스에 연결할 수 있습니다.
| 주석 이름 | 레코드 유형 | level |
|---|---|---|
| CsvRecord | CSV | 클래스 |
| 매개변수 이름 | 유형 | 필수 항목 | 기본값 | 정보 |
|---|---|---|---|---|
| 구분기 | 문자열 | ✓ | 토큰(필수)에서 레코드를 분할하는 데 사용되는 구분 기호는 ',' 또는 ';' 또는 'anything'일 수 있습니다. 지원되는 유일한 공백 문자는 탭(\t)입니다. 다른 공백 문자(spaces)는 지원되지 않습니다. 이 값은 정규식으로 해석됩니다. 정규 표현식에서 특별한 의미가 있는 기호를 사용하려는 경우, 예를 들어 '|' 기호와 같이 마스크해야 합니다. | |
| allowEmptyStream | boolean | false | allowEmptyStream 매개변수를 사용하면 CSV 파일의 실행 불가능한 스트림을 실행할 수 있습니다. | |
| autospanLine | boolean | false | 마지막 레코드의 나머지 행 (선택 사항) - 활성화하면 마지막 열이 행 끝에 자동으로 확장됩니다(예: 주석인 경우 등) 줄에는 모든 문자, 구분자 줄도 포함될 수 있습니다. | |
| CRLF | 문자열 | WINDOWS | 각 레코드(선택 사항) 뒤에 캐리지 반환을 추가하는 데 사용할 문자 - 사용할 캐리지 반환 문자를 정의할 수 있습니다. 이전에 나열된 세 개 이외의 값을 지정하면 입력한 값(사용자)이 CRLF 문자로 사용됩니다. 세 가지 값을 사용할 수 있습니다. ECDHEDOWS, UNIX, MAC 또는 사용자 지정. | |
| endWithLineBreak | boolean | true | CSV 파일이 줄 바꿈으로 끝나야 하는 경우 endWithLineBreak 매개변수 플래그(선택 사항) | |
| generateHeaderColumns | boolean | false | generateHeader>-<s 매개변수를 사용하면 CSV에 열 이름을 포함하는 헤더가 생성된 것을 추가할 수 있습니다. | |
| isOrdered | boolean | false | 메시지 출력 순서를 지정해야 하는지 여부를 나타냅니다. | |
| name | 문자열 | 레코드를 설명하는 이름 (선택 사항) | ||
| quote | 문자열 | " | 지정된 인용 문자(선택 사항)를 사용하여 열 마샬링 여부 - CSV가 생성될 때 필드의 인용문을 지정할 수 있습니다. 이 주석은 모델의 루트 클래스와 연결되며 한 번 선언해야 합니다. | |
| 인용 | boolean | false | 마샬링 시 값(및 헤더)을 따옴표로 묶어야 하는지 여부를 나타냅니다(선택 사항) | |
| quotingEscaped | boolean | false | 인용할 때 값을 이스케이프해야 하는지 여부를 나타냅니다(선택 사항) | |
| removeQuotes | boolean | true | 각 필드의 따옴표를 제거하려고 하는 경우 따옴표 제거 플래그 | |
| skipField | boolean | false | skipField 매개변수를 사용하면 CSV 파일의 필드를 건너뛸 수 있습니다. 일부 필드가 필요하지 않은 경우 생략할 수 있습니다. | |
| skipFirstLine | boolean | false | skipFirstLine 매개변수는 CSV 파일의 첫 번째 줄을 건너뛰거나 생략할 수 없습니다. 이 줄에는 종종 열 정의가 포함됩니다. |
case 1 : separator = ','
CSV 레코드의 필드를 구분하는 데 사용되는 구분 기호는 다음과 같습니다.
10, J, Pauline, M, XD12345678, Fortis Dynamic 15/15, 2500, USD, 08-01-2009
@CsvRecord( separator = "," )
public Class Order {
}
case 2 : separator = ';'
이전 케이스와 비교하면 여기 구분자가 ; 대신 ,
10; J; Pauline; M; XD12345678; Fortis Dynamic 15/15; 2500; USD; 08-01-2009
@CsvRecord( separator = ";" )
public Class Order {
}
case 3: separator = '|'
이전 케이스와 비교하여 다음과 같은 구분 기호 는 다음과 같습니다.
10| J| Pauline| M| XD12345678| Fortis Dynamic 15/15| 2500| USD| 08-01-2009
@CsvRecord( separator = "\\|" )
public Class Order {
}
case 4 : separator = '\",\"'
Camel 2.8.2 이상에 적용
CSV 레코드의 구문 분석할 필드에 . 또는 . 또한 구분자로 사용되는 필드에는 이 경우를 처리하는 방법을 카타릴이 나타내는 다른 전략을 찾아야 합니다. 데이터를 포함하는 필드를 쉼표로 정의하기 위해 구분자(예: '10', 'Street 10, 'USA', 'Street 10, "10', "USA")로 작은 따옴표를 사용합니다.
| __ | 이 경우 한 줄 또는 이중 따옴표인 행의 첫 번째 문자와 마지막 문자는 bindy로 제거됩니다. |
"10","J","Pauline"," M","XD12345678","Fortis Dynamic 15,15","2500","USD","08-01-2009"
@CsvRecord( separator = "\",\"" )
public Class Order {
}
Bindy는 레코드가 작은 또는 이중 따옴표로 묶여 있는지 여부를 자동으로 감지하고 CSV에서 Object로 요약하지 않을 때 해당 따옴표를 자동으로 제거합니다. 따라서 구분 기호에 따옴표를 포함하지 말고 아래와 같이 하면 됩니다.
"10","J","Pauline"," M","XD12345678","Fortis Dynamic 15,15","2500","USD","08-01-2009"
@CsvRecord( separator = "," )
public Class Order {
}
Object에서 CSV로 마샬링하고 따옴표를 사용하려면 @CsvRecord 의 quote 속성을 사용하여 사용할 인용문을 지정해야 합니다.
@CsvRecord( separator = ",", quote = "\"" )
public Class Order {
}
케이스 5 : 구분자 & 건너뛰기FirstLine
이 기능은 클라이언트가 파일의 첫 번째 줄에 데이터 필드 이름인 경우 유용합니다.
order id, client id, first name, last name, isin code, instrument name, quantity, currency, date
구문 분석 프로세스 중에 이 첫 번째 줄을 건너뛰어야 함을 바인딩하려면 다음과 같은 특성을 사용합니다.
@CsvRecord(separator = ",", skipFirstLine = true)
public Class Order {
}
케이스 6: generateHeader>-<s
생성된 CSV의 첫 번째 줄에 추가하려면 다음과 같은 주석에서 generateHeader>-<s를 true로 설정해야 합니다.
@CsvRecord( generateHeaderColumns = true )
public Class Order {
}
결과적으로 Bindy during the unmarshaling process will generate CSV like this :
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
케이스 7 : 운송 반환
camel-bindy가 실행되는 플랫폼이 Windows가 아닌 Macintosh 또는 Unix가 아닌 경우 다음과 같이 crlf 속성을 변경할 수 있습니다. 세 가지 값을 사용할 수 있습니다 : UNIX 또는 MAC
@CsvRecord(separator = ",", crlf="MAC")
public Class Order {
}
또한 어떤 이유로든 다른 줄 끝 문자를 추가해야 하는 경우 crlf 매개변수를 사용하여 지정할 수 있습니다. 다음 예제에서는 쉼표 뒤에 줄 바꿈 문자를 사용하여 행을 종료할 수 있습니다.
@CsvRecord(separator = ",", crlf=",\n")
public Class Order {
}
케이스 8 : isOrdered
경우에 따라 모델의 CSV 레코드를 생성하는 동안 따라야 하는 순서는 구문 분석 중 사용되는 순서와 다릅니다. 그러면 이 경우 isOrdered = true 를 사용하여 DataField 주석의 속성 위치와 함께 이 속성을 표시할 수 있습니다.
@CsvRecord(isOrdered = true)
public Class Order {
@DataField(pos = 1, position = 11)
private int orderNr;
@DataField(pos = 2, position = 10)
private String clientNr;
}
| __ |
|
70.2.2. 2. link 링크 복사링크가 클립보드에 복사되었습니다!
link 주석은 오브젝트를 함께 연결할 수 있습니다.
| 주석 이름 | 레코드 유형 | level |
|---|---|---|
| link | all | 클래스 및 자산 |
| 매개변수 이름 | 유형 | 필수 항목 | 기본값 | 정보 |
|---|---|---|---|---|
| linkType | LinkType | OneToOne | 클래스 간 관계를 식별하는 링크 유형입니다. |
현재 버전에 따라 일대일 관계만 허용됩니다.
예: 모델 클래스 Client가 Order 클래스에 연결된 경우 다음과 같이 Order 클래스에서 annotation Link를 사용합니다.
속성 링크
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@Link
private Client client;
}
다음은 Client 클래스의 경우:
클래스 링크
@Link
public class Client {
}
70.2.3. 3. DataField 링크 복사링크가 클립보드에 복사되었습니다!
DataField 주석은 필드의 속성을 정의합니다. 각 datafield는 레코드의 위치, 유형(문자열, int, date, …) 및 선택적으로 패턴으로 식별됩니다.
| 주석 이름 | 레코드 유형 | level |
|---|---|---|
| DataField | all | 속성 |
| 매개변수 이름 | 유형 | 필수 항목 | 기본값 | 정보 |
|---|---|---|---|---|
| POS | int | ✓ | 입력 레코드의 데이터 위치는 1(필수)부터 시작해야 합니다. position 매개 변수를 참조하십시오. | |
| align | 문자열 | R | 텍스트를 오른쪽 또는 왼쪽으로 정렬합니다. <tt>R</tt> 또는 <tt>L</tt> 값을 사용합니다. | |
| 클립 | boolean | false | 고정 길이를 사용할 때 허용되는 길이를 초과하는 경우 필드의 데이터를 잘라내도록 나타냅니다. | |
| columnName | 문자열 |
헤더 열의 이름입니다(선택 사항). 속성 이름을 기본값으로 사용합니다. | ||
| decimalSeparator | 문자열 | BigDecimal 숫자와 함께 사용할 10진수 분리기 | ||
| defaultValue | 문자열 | 값이 설정되지 않은 경우 필드의 기본값 | ||
| 구분 기호 | 문자열 | 필드에 가변 길이가 있는 경우 사용할 선택적 구분 기호 | ||
| groupingSeparator | 문자열 | Grouping Separator to be used with BigDecimal number when we would like to format/parse to number with grouping e.g. 10.0.0.1,456.789 | ||
| impliedDecimalSeparator | boolean | false | 지정된 위치에 부동 소수점이 있는지 여부를 나타냅니다.Indicates if there is a decimal point implied at a specified location. | |
| 길이 | int | 0 | 레코드가 고정된 길이로 설정된 경우 데이터 블록의 길이(숫자) | |
| lengthPos | int | 0 | 이 필드에 예상 고정된 길이를 정의하는 레코드의 데이터 필드를 식별합니다.Identifies a data field in the record that defines the expected fixed length for this field. | |
| method | 문자열 | DataField에 이러한 사용자 지정을 적용하기 위해 호출할 메서드 이름입니다. datafield 자체의 메서드여야 하며 클래스 메서드의 정적 정규화된 이름을 제공해야 합니다(예: 단위 테스트 org.apache.camel.dataformat.bindy.csv.BindySimpleCsvFunctionWithExternalMethodTest.replaceToanchor). | ||
| name | 문자열 | 필드의 이름 (선택 사항) | ||
| paddingChar | grafka | 레코드가 고정된 길이로 설정된 경우와 함께 줄임 | ||
| 패턴 | 문자열 | Java 포맷터(예별SimpleDateFormat)가 데이터를 변환하는 데 사용하는 패턴(선택 사항)입니다. 패턴을 사용하는 경우 bindy 데이터 형식으로 로케일을 설정하는 것이 좋습니다. "us"와 같은 알려진 로케일로 설정하거나 "default"를 사용하여 플랫폼 기본 로케일을 사용합니다. | ||
| 위치 | int | 0 | 생성된 출력 메시지의 필드 위치입니다(1부터 시작). CSV에서 생성된 필드(출력 메시지)의 위치가 입력 위치(pos)와 비교되어야 하는 경우 사용해야 합니다. pos 매개변수를 참조하십시오. | |
| Precision | int | 0 | 생성할 \{@link java.math.BigDecimal} 번호의 정밀성 | |
| 필수 항목 | boolean | false | 필드가 필수인지 여부를 나타냅니다. | |
| 반올림 | 문자열 | 통합 | Round mode to be used to be used to be used to be used to be used to round/scale a BigDecimal Values : UP, DOWN, nodejsILING, FLOOR, HALF_UP, HALF_UP,HALF_DOWN, UNNECESEN, UNNECESSARY 예: number = 123456.789, Precision = 2, Rounding = 1, 1234ILING Result : 123456 | |
| timezone | 문자열 | 사용할 시간대입니다. | ||
| Trim | boolean | false | 값을 트리밍할지 여부를 나타냅니다.Indicates whether the value should be trimmed |
케이스 1 : pos
이 매개변수/attribute는 CSV 레코드의 필드 위치를 나타냅니다.
위치
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 5)
private String isinCode;
}
이 예제에서 위치가 1 에서 시작되지만 클래스 순서의 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;
}
케이스 2 : 패턴
패턴을 통해 데이터 형식을 강화하거나 검증할 수 있습니다.
패턴
@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;
}
케이스 3: 정확도
정확도는 숫자의 10진수 부분을 정의하려는 경우에 유용합니다.
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;
}
case 4 : Position은 출력마다 다릅니다.
position 속성은 생성된 CSV 레코드에 필드를 배치하는 방법을 바인딩합니다. 기본적으로 사용되는 위치는 특성 pos 에 정의된 위치에 해당합니다. 위치가 다른 경우 (즉, 미정형에서 마샬링을 비교한다는 것을 의미함) 우리는 위치를 사용하여 이를 나타낼 수 있습니다.
예를 들면 다음과 같습니다.
위치가 출력마다 다릅니다.
@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;
}
주석 @DataField 의 이 속성은 속성과 함께 사용해야 합니다. @CsvRecord 주석의 isOrdered = true 입니다.
케이스 5 : 필요
필드가 필수인 경우, 필요한 특성을 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;
}
이 필드가 레코드에 없으면 다음 정보와 함께 구문 분석기에 오류가 발생합니다.
Some fields are missing (optional or mandatory), line :
케이스 6: 트리밍
필드에 처리되기 전에 제거해야 하는 선행 및/또는 후행 공백이 있는 경우 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;
}
case 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;
}
케이스 8: columnName
@CsvRecord 에 주석 generateHeader>-<s = 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;
}
이 속성은 선택적 필드에만 적용할 수 있습니다.
70.2.4. 4. FixedLengthRecord 링크 복사링크가 클립보드에 복사되었습니다!
FixedLengthRecord 주석은 모델의 루트 클래스를 식별하는 데 사용됩니다. 레코드 = "데이터 고정 길이(자수) 형식이 지정된 파일/메시지를 나타내며 여러 하위 모델 클래스에 연결할 수 있습니다. 이 형식은 필드의 데이터를 오른쪽 또는 왼쪽에 맞게 정렬할 수 있기 때문에 약간 특정적입니다.
데이터 크기가 필드의 길이를 완전히 채우지 않으면 '패드' 문자를 추가할 수 있습니다.
| 주석 이름 | 레코드 유형 | level |
|---|---|---|
| FixedLengthRecord | 수정됨 | 클래스 |
| 매개변수 이름 | 유형 | 필수 항목 | 기본값 | 정보 |
|---|---|---|---|---|
| countGrapheme | boolean | false | 줄선이 계산되는 방식을 나타냅니다. | |
| CRLF | 문자열 | WINDOWS | 각 레코드 다음에 캐리지 리턴을 추가하는 데 사용할 문자(선택 사항) 가능한 값: >-<DOWS, UNIX, MAC 또는 사용자 지정. 이 옵션은 마샬링 중에만 사용되며 unmarshalling은 eol을 사용자 정의하지 않는 한 시스템 기본 JDK 제공 줄 구분 기호를 사용합니다. | |
| EOL | 문자열 | 마샬링은 다른 줄 구분 기호 중 하나에만 사용되며, 마샬링은 다른 값을 제공하지 않는 한 시스템 기본 줄 구분 기호(선택 사항 - default: "", 기본 JDK 제공 줄 구분 기호를 사용할 수 있도록 지원) 이후 줄 종료를 처리하는 데 사용할 문자입니다. | ||
| footer | 클래스 | void | 파일 끝에 이 유형의 레코드가 한 발씩 올 수 있음을 나타냅니다.Indicates that the record(s) of this type may be followed by a single footer record at the end of the file. | |
| header | 클래스 | void | 이 유형의 레코드가 파일 시작 시 단일 헤더 레코드 앞에 있을 수 있음을 나타냅니다. | |
| ignoreMissingChars | boolean | false | 너무 짧은 줄이 무시되는지 여부를 나타냅니다. | |
| ignoreTrailingChars | boolean | false | 요약 / 구문 분석 시 마지막으로 매핑된 filed 이외의 문자는 무시될 수 있음을 나타냅니다. 이 주석은 모델의 루트 클래스와 연결되며 한 번 선언해야 합니다. | |
| 길이 | int | 0 | 레코드의 고정된 길이(자 수)입니다. 레코드가 항상 \{#paddingChar()}'s로 채워지는 것을 의미합니다. | |
| name | 문자열 | 레코드를 설명하는 이름 (선택 사항) | ||
| paddingChar | grafka | 함께 사용할 줄임말입니다. | ||
| skipFooter | boolean | false | footer 레코드 마샬링 / 마샬링을 건너뛰도록 데이터 형식을 설정합니다. 기본 레코드(예: 헤더 또는 도글러가 아닌)에서 이 매개 변수를 구성합니다. | |
| skipHeader | boolean | false | 헤더 레코드의 마샬링 / 마샬링을 건너뛰도록 데이터 형식을 구성합니다. 기본 레코드(예: 헤더 또는 도글러가 아닌)에서 이 매개 변수를 구성합니다. |
레코드는 헤더/축소 및 기본 고정 길이 레코드가 모두 아닐 수 있습니다.
케이스 1: 간단한 고정 길이 레코드
이 간단한 예제에서는 고정 메시지의 구문 분석/포멧을 사용하도록 모델을 설계하는 방법을 보여줍니다.
10A9PaulineMISINXD12345678BUYShare2500.45USD01-08-2009
고정 간단한
@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;
}
케이스 2 : 정렬 및 패딩을 사용하여 길이 레코드 수정
이 더 세분화된 예제에서는 필드의 맞춤을 정의하는 방법과 ' ''인 패딩 문자를 할당하는 방법을 보여줍니다.
10A9 PaulineM ISINXD12345678BUYShare2500.45USD01-08-2009
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;
}
케이스 3: 필드 패딩
경우에 따라 레코드에 정의된 기본 패딩은 필드에 적용되지 않는 경우가 있습니다. ' '' 대신 '0'을 사용하여 '0'을 실행하려는 숫자 형식이 있습니다. 이 경우 모델에서 @DataField 의 속성 패딩Char 을 사용하여 이 값을 설정할 수 있습니다.
10A9 PaulineM ISINXD12345678BUYShare000002500.45USD01-08-2009
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;
}
케이스 4: 구분자가 포함된 수정 길이 레코드
고정 길이 레코드는 종종 레코드 내에서 구분된 콘텐츠가 있습니다. firstName 및 lastName 필드는 다음 예제에서 ^ 문자로 구분됩니다.
10A9Pauline^M^ISINXD12345678BUYShare000002500.45USD01-08-2009
고정 구분
@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;
}
고정 길이 레코드의 pos 값(s)은 정확한 열 번호 대신 서수, 순차적 값을 사용하여 선택적으로 정의할 수 있습니다.
case 5 : 레코드 정의 필드 길이를 사용하여 수정된 길이 레코드
때때로 고정 길이 레코드에는 동일한 레코드 내의 다른 필드의 예상 길이를 정의하는 필드가 포함될 수 있습니다. 다음 예제에서 instrumentNumber 필드 값의 길이는 레코드의 instrumentNumberLen 필드 값으로 정의됩니다.
10A9Pauline^M^ISIN10XD12345678BUYShare000002500.45USD01-08-2009
고정 구분
@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;
}
케이스 6 : 헤더와 각면을 사용하여 길이 레코드 수정
Bindy는 정렬된 클래스가 기본 @FixedLengthRecord 클래스와 동일한 패키지에 있거나 구성된 검사 패키지 중 하나에 있는 경우 모델의 일부로 구성된 고정 길이 헤더 및 푸터 레코드를 검색합니다. 다음 텍스트는 헤더 레코드와 테일러 레코드로 요약된 두 개의 고정 길이 레코드를 보여줍니다.
101-08-2009
10A9 PaulineM ISINXD12345678BUYShare000002500.45USD01-08-2009
10A9 RichN ISINXD12345678BUYShare000002700.45USD01-08-2009
9000000002
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;
}
케이스 7 : 고정된 길이 레코드를 구문 분석할 때 콘텐츠 스케이핑
대상 사용 사례에 필요한 것보다 더 많은 정보를 포함하는 고정 길이 레코드를 제공하는 시스템과 통합하는 것이 일반적입니다. 이 경우 필요하지 않은 필드의 선언 및 구문 분석을 생략하는 것이 유용합니다. 이를 위해 Bindy는 다음 선언된 필드의 pos 값이 마지막 구문 분석 필드의 커서 위치를 벗어나는 경우 레코드 내의 다음 매핑된 필드로 건너뜁니다. 관심 필드(보조 값 대신)에 절대 pos 위치를 사용하면 Bindy가 두 필드 간의 콘텐츠를 건너뜁니다.
마찬가지로, 특정 필드 이외의 어떠한 콘텐츠도 관심을 가질 수 없습니다. 이 경우 @FixedLengthRecord 선언에서 ignoreTrailingChars 속성을 설정하여 마지막 매핑 필드 이외의 모든 항목의 분석을 건너뛰도록 바인딩에 지시할 수 있습니다.
@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
}
70.2.5. 5. 메시지 링크 복사링크가 클립보드에 복사되었습니다!
Message 주석은 키 값 쌍 필드를 포함할 모델의 클래스를 식별하는 데 사용됩니다. 이러한 종류의 형식은 주로 FIX(Fixin Exchange Protocol Messages)에서 사용됩니다. 하지만 이 주석은 데이터가 키로 식별되는 다른 형식에 사용할 수 있습니다. 키 쌍 값은 탭 구분기 (유니코드 표현 : \u0009)와 같은 특수 문자가 될 수있는 구분자로 서로 분리되거나 (유코드 표현 : \u0001)
FIX 메시지로 작업하려면 모델에 Order 클래스일 수 있는 루트 메시지 클래스에 연결된 Header 및 Trailer 클래스가 포함되어야 합니다. 필수는 아니지만 quickFix 프로젝트를 기반으로 한 수정 게이트웨이인 camel-bindy와 함께 camel-bindy를 사용할 때 매우 유용합니다.
| 주석 이름 | 레코드 유형 | level |
|---|---|---|
| 메시지 | 키 값 쌍 | 클래스 |
| 매개변수 이름 | 유형 | 필수 항목 | 기본값 | 정보 |
|---|---|---|---|---|
| keyValuePairSeparator | 문자열 | ✓ | 키 값 쌍 구분 기호는 키(필수)에서 값을 분할하는 데 사용됩니다. '\u0001', '\u0009', '#' 또는 'anything'일 수 있습니다. | |
| pairSeparator | 문자열 | ✓ | 토큰으로 키 값 쌍을 분할하는 데 사용되는 쌍 구분자(필수)입니다. '=', ';' 또는 'anything'일 수 있습니다. | |
| CRLF | 문자열 | WINDOWS | 각 레코드 다음에 캐리지 리턴을 추가하는 데 사용할 문자(선택 사항) 가능한 값 = ECDHEDOWS, UNIX, MAC 또는 사용자 지정. 이전에 나열된 세 개 이외의 값을 지정하면 입력한 값(사용자)이 CRLF 문자로 사용됩니다. | |
| isOrdered | boolean | false | 메시지 출력 순서를 지정해야 하는지 여부를 나타냅니다. 이 주석은 모델의 메시지 클래스와 연결되며 한 번 선언해야 합니다. | |
| name | 문자열 | 메시지 설명의 이름 (선택 사항) | ||
| type | 문자열 | FIX | type은 메시지 유형을 정의하는 데 사용됩니다 (예: FIX, EMX, …) (선택 사항) | |
| 버전 | 문자열 | 4.1 | version은 메시지 버전(예: 4.1, …)을 정의합니다(선택 사항) |
case 1 : 구분자 = 'u0001'
FIX 메시지에서 키 값 쌍 필드를 분할하는 데 사용되는 구분자는 ASCII 01 문자 또는 유니코드 형식 \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 ...
주석을 사용하는 방법:
수정 - 메시지
@Message(keyValuePairSeparator = "=", pairSeparator = "\u0001", type="FIX", version="4.1")
public class Order {
}
테스트 사례 살펴보기
Tab과 같은 ASCII 문자 …은 WillKI 페이지에 표시할 수 없습니다. 따라서 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)와 같은 방식을 정확히 볼 수 있는 camel-bindy 테스트 케이스를 살펴 보십시오.
70.2.6. 6. KeyValuePairField 링크 복사링크가 클립보드에 복사되었습니다!
KeyValuePairField 주석은 키 값 쌍 필드의 속성을 정의합니다. 각 KeyValuePairField는 태그(= 키)와 연결된 값, 유형(문자열, int, date, …)로 식별되며, 패턴을 선택적으로, 필드가 필요한 경우입니다.
| 주석 이름 | 레코드 유형 | level |
|---|---|---|
| KeyValuePairField | 키 값 쌍 - FIX | 속성 |
| 매개변수 이름 | 유형 | 필수 항목 | 기본값 | 정보 |
|---|---|---|---|---|
| tag | int | ✓ | 메시지에서 필드를 식별하는 태그(필수) - 고유해야 함 | |
| impliedDecimalSeparator | boolean | false | <B>Camel 2.11:</b> 지정된 위치에 표시된 소수점이 있는지 여부를 나타냅니다. | |
| name | 문자열 | 필드의 이름 (선택 사항) | ||
| 패턴 | 문자열 | 포맷자가 데이터를 변환하는 데 사용할 패턴 (선택 사항) | ||
| 위치 | int | 0 | 생성된 메시지의 필드 위치 - FIX 메시지에서 키/태그 위치가 달라야 하는 경우 사용해야 합니다. | |
| Precision | int | 0 | 생성할 BigDecimal 번호의 정확도 | |
| 필수 항목 | boolean | false | 필드가 필수인지 여부를 나타냅니다. | |
| timezone | 문자열 | 사용할 시간대입니다. |
케이스 1 : 태그
이 매개변수는 메시지의 필드 키를 나타냅니다.
수정 메시지 - 태그
@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;
}
case 2 : 출력의 다른 위치
FIX 메시지에 배치할 태그/키를 미리 정의한 순서에 따라 정렬해야 하는 경우 주석 @KeyValuePairField 의 특성 위치를 사용합니다.
수정 메시지 - 태그 - 정렬
@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;
}
70.2.7. 7. 섹션 링크 복사링크가 클립보드에 복사되었습니다!
고정 길이 레코드의 FIX 메시지에서 일반적으로 information : header, body 및 섹션 표현에 다른 섹션이 있습니다. 주석 @Section 의 목적은 모델의 어떤 클래스가 헤더(= 섹션 1), body(= 섹션 2) 및 footer(= 섹션 3)를 나타내는 바인딩에 대해 알리는 것입니다.
이 주석에는 하나의 속성/parameter만 있습니다.
| 주석 이름 | 레코드 유형 | level |
|---|---|---|
| 섹션 | FIX | 클래스 |
| 매개변수 이름 | 유형 | 필수 항목 | 기본값 | 정보 |
|---|---|---|---|---|
| number | int | ✓ | 섹션의 수 |
케이스 1: 섹션
header 섹션의 정의:
FIX message - section - Header
@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;
}
본문 섹션의 정의:
수정 메시지 - 섹션 - body
@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;
footer 섹션의 정의:
오류 메시지 - 섹션 -
@Section(number = 3)
public class Trailer {
@KeyValuePairField(tag = 10, position = 1)
// CheckSum
private int checkSum;
public int getCheckSum() {
return checkSum;
}
70.2.8. 8. OneToMany 링크 복사링크가 클립보드에 복사되었습니다!
주석 @OneToMany 의 용도는 List<?& gt; 필드로 정의되는 클래스 또는 반복적인 그룹을 포함하는 레코드에서 작업할 수 있도록 허용하는 것입니다.
OneToMany
에 대한 제한 사항: 많은 바인딩으로 인해 계층 구조의 여러 수준에 정의된 반복을 처리할 수 없습니다.
다음의 경우 OneToMany ONLY WORKS
- 반복적인 그룹(= 태그/키 그룹)을 포함하는 FIX 메시지 읽기
- 반복적인 데이터가 포함된 CSV 생성
| 주석 이름 | 레코드 유형 | level |
|---|---|---|
| OneToMany | all | 속성 |
| 매개변수 이름 | 유형 | 필수 항목 | 기본값 | 정보 |
|---|---|---|---|---|
| mappedTo | 문자열 | List<Type of the Class>의 유형과 연관된 클래스 이름 |
case 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
반복적인 데이터는 책 제목과 게시 날짜의 제목과 관련된 반면, 성과 기간이 일반적이며, 이를 모델링하는 데 사용되는 클래스가 있습니다. 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;
}
case 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
태그 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;
}
70.2.9. 9. BindyConverter 링크 복사링크가 클립보드에 복사되었습니다!
주석 @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();
}
}
70.2.10. 10. FormatFactories 링크 복사링크가 클립보드에 복사되었습니다!
주석 @FormatFactories 의 목적은 레코드 수준에서 변환기 집합을 정의하는 것입니다. 제공된 클래스는 FormatFactoryInterface 인터페이스를 구현해야 합니다.
@CsvRecord(separator = ",")
@FormatFactories({OrderNumberFormatFactory.class})
public static class Order {
@DataField(pos = 1)
private OrderNumber orderNr;
@DataField(pos = 2)
private String firstName;
}
public static class OrderNumber {
private int orderNr;
public static OrderNumber ofString(String orderNumber) {
OrderNumber result = new OrderNumber();
result.orderNr = Integer.valueOf(orderNumber);
return result;
}
}
public static class OrderNumberFormatFactory extends AbstractFormatFactory {
{
supportedClasses.add(OrderNumber.class);
}
@Override
public Format<?> build(FormattingOptions formattingOptions) {
return new Format<OrderNumber>() {
@Override
public String format(OrderNumber object) throws Exception {
return String.valueOf(object.orderNr);
}
@Override
public OrderNumber parse(String string) throws Exception {
return OrderNumber.ofString(string);
}
};
}
}