57.2. 주석


생성된 주석을 통해 모델의 다른 개념을 다음과 같이 매핑할 수 있습니다.

  • 레코드 유형(CSV, 키 값 쌍(예: FIX 메시지), 고정 길이 …​)
  • link(다른 오브젝트의 링크)
  • DataField 및 해당 속성(int, type, …​)
  • KeyValuePairField (FIX 재무 메시지에서와 같은 키 = 값 형식)
  • 섹션(헤더, 본문 및 각자 섹션을 식별할 수 있음)
  • OneToMany,
  • BindyConverter,
  • FormatFactories

이 섹션에서는 이러한 내용을 설명합니다.

57.2.1. 1. CsvRecord

CsvRecord 주석은 모델의 루트 클래스를 식별하는 데 사용됩니다. 레코드 = "csv 파일의 줄"을 나타내며 여러 하위 모델 클래스에 연결할 수 있습니다.

Expand
주석 이름레코드 유형level

CsvRecord

CSV

클래스

Expand
매개변수 이름유형필수 항목기본값정보

구분기

문자열

 

토큰(필수)에서 레코드를 분할하는 데 사용되는 구분 기호는 ',' 또는 ';' 또는 '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
Copy to Clipboard Toggle word wrap
@CsvRecord( separator = "," )
public Class Order {

}
Copy to Clipboard Toggle word wrap

case 2 : separator = ';'

이전 케이스와 비교하면 여기 구분자가 ; 대신 ,

10; J; Pauline; M; XD12345678; Fortis Dynamic 15/15; 2500; USD; 08-01-2009
Copy to Clipboard Toggle word wrap
@CsvRecord( separator = ";" )
public Class Order {

}
Copy to Clipboard Toggle word wrap

case 3: separator = '|'

이전 케이스와 비교하여 다음과 같은 구분 기호 다음과 같습니다.

10| J| Pauline| M| XD12345678| Fortis Dynamic 15/15| 2500| USD| 08-01-2009
Copy to Clipboard Toggle word wrap
@CsvRecord( separator = "\\|" )
public Class Order {

}
Copy to Clipboard Toggle word wrap

case 4 : separator = '\",\"'

Camel 2.8.2 이상에 적용

CSV 레코드의 구문 분석할 필드에 . 또는 . 또한 구분자로 사용되는 필드에는 이 경우를 처리하는 방법을 카타릴이 나타내는 다른 전략을 찾아야 합니다. 데이터를 포함하는 필드를 쉼표로 정의하기 위해 구분자(예: '10', 'Street 10, 'USA', 'Street 10, "10', "USA")로 작은 따옴표를 사용합니다.

Expand

__

이 경우 한 줄 또는 이중 따옴표인 행의 첫 번째 문자와 마지막 문자는 bindy로 제거됩니다.

"10","J","Pauline"," M","XD12345678","Fortis Dynamic 15,15","2500","USD","08-01-2009"
Copy to Clipboard Toggle word wrap
@CsvRecord( separator = "\",\"" )
public Class Order {

}
Copy to Clipboard Toggle word wrap

Bindy는 레코드가 작은 또는 이중 따옴표로 묶여 있는지 여부를 자동으로 감지하고 CSV에서 Object로 요약하지 않을 때 해당 따옴표를 자동으로 제거합니다. 따라서 구분 기호에 따옴표를 포함하지 말고 아래와 같이 하면 됩니다.

"10","J","Pauline"," M","XD12345678","Fortis Dynamic 15,15","2500","USD","08-01-2009"
Copy to Clipboard Toggle word wrap
@CsvRecord( separator = "," )
public Class Order {

}
Copy to Clipboard Toggle word wrap

Object에서 CSV로 마샬링하고 따옴표를 사용하려면 @CsvRecordquote 속성을 사용하여 사용할 인용문을 지정해야 합니다.

@CsvRecord( separator = ",", quote = "\"" )
public Class Order {

}
Copy to Clipboard Toggle word wrap

케이스 5 : 구분자 & 건너뛰기FirstLine

이 기능은 클라이언트가 파일의 첫 번째 줄에 데이터 필드 이름인 경우 유용합니다.

order id, client id, first name, last name, isin code, instrument name, quantity, currency, date
Copy to Clipboard Toggle word wrap

구문 분석 프로세스 중에 이 첫 번째 줄을 건너뛰어야 함을 바인딩하려면 다음과 같은 특성을 사용합니다.

@CsvRecord(separator = ",", skipFirstLine = true)
public Class Order {

}
Copy to Clipboard Toggle word wrap

케이스 6: generateHeader>-<s

생성된 CSV의 첫 번째 줄에 추가하려면 다음과 같은 주석에서 generateHeader>-<s를 true로 설정해야 합니다.

@CsvRecord( generateHeaderColumns = true )
public Class Order {

}
Copy to Clipboard Toggle word wrap

결과적으로 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
Copy to Clipboard Toggle word wrap

케이스 7 : 운송 반환

camel-bindy가 실행되는 플랫폼이 Windows가 아닌 Macintosh 또는 Unix가 아닌 경우 다음과 같이 crlf 속성을 변경할 수 있습니다. 세 가지 값을 사용할 수 있습니다 : UNIX 또는 MAC

@CsvRecord(separator = ",", crlf="MAC")
public Class Order {

}
Copy to Clipboard Toggle word wrap

또한 어떤 이유로든 다른 줄 끝 문자를 추가해야 하는 경우 crlf 매개변수를 사용하여 지정할 수 있습니다. 다음 예제에서는 쉼표 뒤에 줄 바꿈 문자를 사용하여 행을 종료할 수 있습니다.

@CsvRecord(separator = ",", crlf=",\n")
public Class Order {

}
Copy to Clipboard Toggle word wrap

케이스 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;

}
Copy to Clipboard Toggle word wrap
Expand

__

POS 는 파일 스트림을 구문 분석하는 데 사용되며, 위치는 CSV를 생성하는 데 사용됩니다.

57.2.3. 3. DataField

DataField 주석은 필드의 속성을 정의합니다. 각 datafield는 레코드의 위치, 유형(문자열, int, date, …​) 및 선택적으로 패턴으로 식별됩니다.

Expand
주석 이름레코드 유형level

DataField

all

속성

Expand
매개변수 이름유형필수 항목기본값정보

POS

int

 

입력 레코드의 데이터 위치는 1(필수)부터 시작해야 합니다. position 매개 변수를 참조하십시오.

align

문자열

 

R

텍스트를 오른쪽 또는 왼쪽으로 정렬합니다. <tt>R</tt> 또는 <tt>L</tt> 값을 사용합니다.

클립

boolean

 

false

고정 길이를 사용할 때 허용되는 길이를 초과하는 경우 필드의 데이터를 잘라내도록 나타냅니다.

columnName

문자열

  

헤더 열의 이름입니다(선택 사항). 속성 이름을 기본값으로 사용합니다. CsvRecord generateHeader>-<s = true인경우에만 적용됩니다.

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;

}
Copy to Clipboard Toggle word wrap

이 예제에서 위치가 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;
}
Copy to Clipboard Toggle word wrap

케이스 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;
}
Copy to Clipboard Toggle word wrap

케이스 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;
}
Copy to Clipboard Toggle word wrap

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;
}
Copy to Clipboard Toggle word wrap

주석 @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;
}
Copy to Clipboard Toggle word wrap

이 필드가 레코드에 없으면 다음 정보와 함께 구문 분석기에 오류가 발생합니다.

Some fields are missing (optional or mandatory), line :
Copy to Clipboard Toggle word wrap

케이스 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;
}
Copy to Clipboard Toggle word wrap

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;
}
Copy to Clipboard Toggle word wrap

케이스 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;
}
Copy to Clipboard Toggle word wrap

이 속성은 선택적 필드에만 적용할 수 있습니다.

57.2.4. 4. FixedLengthRecord

FixedLengthRecord 주석은 모델의 루트 클래스를 식별하는 데 사용됩니다. 레코드 = "데이터 고정 길이(자수) 형식이 지정된 파일/메시지를 나타내며 여러 하위 모델 클래스에 연결할 수 있습니다. 이 형식은 필드의 데이터를 오른쪽 또는 왼쪽에 맞게 정렬할 수 있기 때문에 약간 특정적입니다.

데이터 크기가 필드의 길이를 완전히 채우지 않으면 '패드' 문자를 추가할 수 있습니다.

Expand
주석 이름레코드 유형level

FixedLengthRecord

수정됨

클래스

Expand
매개변수 이름유형필수 항목기본값정보

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

고정 간단한

@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 Toggle word wrap

케이스 2 : 정렬 및 패딩을 사용하여 길이 레코드 수정

이 더 세분화된 예제에서는 필드의 맞춤을 정의하는 방법과 ' ''인 패딩 문자를 할당하는 방법을 보여줍니다.

10A9 PaulineM ISINXD12345678BUYShare2500.45USD01-08-2009
Copy to Clipboard Toggle word wrap

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;
}
Copy to Clipboard Toggle word wrap

케이스 3: 필드 패딩

경우에 따라 레코드에 정의된 기본 패딩은 필드에 적용되지 않는 경우가 있습니다. ' '' 대신 '0'을 사용하여 '0'을 실행하려는 숫자 형식이 있습니다. 이 경우 모델에서 @DataField 의 속성 패딩Char 을 사용하여 이 값을 설정할 수 있습니다.

10A9 PaulineM ISINXD12345678BUYShare000002500.45USD01-08-2009
Copy to Clipboard Toggle word wrap

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;
}
Copy to Clipboard Toggle word wrap

케이스 4: 구분자가 포함된 수정 길이 레코드

고정 길이 레코드는 종종 레코드 내에서 구분된 콘텐츠가 있습니다. firstName 및 lastName 필드는 다음 예제에서 ^ 문자로 구분됩니다.

10A9Pauline^M^ISINXD12345678BUYShare000002500.45USD01-08-2009
Copy to Clipboard Toggle word wrap

고정 구분

@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 Toggle word wrap

고정 길이 레코드의 pos 값(s)은 정확한 열 번호 대신 서수, 순차적 값을 사용하여 선택적으로 정의할 수 있습니다.

case 5 : 레코드 정의 필드 길이를 사용하여 수정된 길이 레코드

때때로 고정 길이 레코드에는 동일한 레코드 내의 다른 필드의 예상 길이를 정의하는 필드가 포함될 수 있습니다. 다음 예제에서 instrumentNumber 필드 값의 길이는 레코드의 instrumentNumberLen 필드 값으로 정의됩니다.

10A9Pauline^M^ISIN10XD12345678BUYShare000002500.45USD01-08-2009
Copy to Clipboard Toggle word wrap

고정 구분

@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 Toggle word wrap

케이스 6 : 헤더와 각면을 사용하여 길이 레코드 수정

Bindy는 정렬된 클래스가 기본 @FixedLengthRecord 클래스와 동일한 패키지에 있거나 구성된 검사 패키지 중 하나에 있는 경우 모델의 일부로 구성된 고정 길이 헤더 및 푸터 레코드를 검색합니다. 다음 텍스트는 헤더 레코드와 테일러 레코드로 요약된 두 개의 고정 길이 레코드를 보여줍니다.

101-08-2009
10A9 PaulineM ISINXD12345678BUYShare000002500.45USD01-08-2009
10A9 RichN ISINXD12345678BUYShare000002700.45USD01-08-2009
9000000002
Copy to Clipboard Toggle word wrap

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;
}
Copy to Clipboard Toggle word wrap

케이스 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

}
Copy to Clipboard Toggle word wrap

57.2.5. 5. 메시지

Message 주석은 키 값 쌍 필드를 포함할 모델의 클래스를 식별하는 데 사용됩니다. 이러한 종류의 형식은 주로 FIX(Fixin Exchange Protocol Messages)에서 사용됩니다. 하지만 이 주석은 데이터가 키로 식별되는 다른 형식에 사용할 수 있습니다. 키 쌍 값은 탭 구분기 (유니코드 표현 : \u0009)와 같은 특수 문자가 될 수있는 구분자로 서로 분리되거나 (유코드 표현 : \u0001)

참고

FIX 메시지로 작업하려면 모델에 Order 클래스일 수 있는 루트 메시지 클래스에 연결된 Header 및 Trailer 클래스가 포함되어야 합니다. 필수는 아니지만 quickFix 프로젝트를 기반으로 한 수정 게이트웨이인 camel-bindy와 함께 camel-bindy를 사용할 때 매우 유용합니다.

Expand
주석 이름레코드 유형level

메시지

키 값 쌍

클래스

Expand
매개변수 이름유형필수 항목기본값정보

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

주석을 사용하는 방법:

수정 - 메시지

@Message(keyValuePairSeparator = "=", pairSeparator = "\u0001", type="FIX", version="4.1")
public class Order {

}
Copy to Clipboard Toggle word wrap

테스트 사례 살펴보기

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 테스트 케이스를 살펴 보십시오.

57.2.6. 6. KeyValuePairField

KeyValuePairField 주석은 키 값 쌍 필드의 속성을 정의합니다. 각 KeyValuePairField는 태그(= 키)와 연결된 값, 유형(문자열, int, date, …​)로 식별되며, 패턴을 선택적으로, 필드가 필요한 경우입니다.

Expand
주석 이름레코드 유형level

KeyValuePairField

키 값 쌍 - FIX

속성

Expand
매개변수 이름유형필수 항목기본값정보

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;
}
Copy to Clipboard Toggle word wrap

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;
}
Copy to Clipboard Toggle word wrap

57.2.7. 7. 섹션

고정 길이 레코드의 FIX 메시지에서 일반적으로 information : header, body 및 섹션 표현에 다른 섹션이 있습니다. 주석 @Section 의 목적은 모델의 어떤 클래스가 헤더(= 섹션 1), body(= 섹션 2) 및 footer(= 섹션 3)를 나타내는 바인딩에 대해 알리는 것입니다.

이 주석에는 하나의 속성/parameter만 있습니다.

Expand
주석 이름레코드 유형level

섹션

FIX

클래스

Expand
매개변수 이름유형필수 항목기본값정보

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;
}
Copy to Clipboard Toggle word wrap

본문 섹션의 정의:

수정 메시지 - 섹션 - 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;
Copy to Clipboard Toggle word wrap

footer 섹션의 정의:

오류 메시지 - 섹션 -

@Section(number = 3)
public class Trailer {

    @KeyValuePairField(tag = 10, position = 1)
    // CheckSum
    private int checkSum;

    public int getCheckSum() {
        return checkSum;
    }
Copy to Clipboard Toggle word wrap

57.2.8. 8. OneToMany

주석 @OneToMany 의 용도는 List<?& gt; 필드로 정의되는 클래스 또는 반복적인 그룹을 포함하는 레코드에서 작업할 수 있도록 허용하는 것입니다.

참고

OneToMany
에 대한 제한 사항
: 많은 바인딩으로 인해 계층 구조의 여러 수준에 정의된 반복을 처리할 수 없습니다.

다음의 경우 OneToMany ONLY WORKS

  • 반복적인 그룹(= 태그/키 그룹)을 포함하는 FIX 메시지 읽기
  • 반복적인 데이터가 포함된 CSV 생성
Expand
주석 이름레코드 유형level

OneToMany

all

속성

Expand
매개변수 이름유형필수 항목기본값정보

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
Copy to Clipboard Toggle word wrap
참고

반복적인 데이터는 책 제목과 게시 날짜의 제목과 관련된 반면, 성과 기간이 일반적이며, 이를 모델링하는 데 사용되는 클래스가 있습니다. 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;
}
Copy to Clipboard Toggle word wrap

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

태그 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;
}
Copy to Clipboard Toggle word wrap

57.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();
    }
}
Copy to Clipboard Toggle word wrap

57.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);
            }
        };
    }
}
Copy to Clipboard Toggle word wrap
맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat