2013-07-10 3 views
1

여러 반복 세그먼트를 포함하는 고정 길이 파일에 대한 매핑 파일을 만들려고합니다. 문제는, 이러한 세그먼트 중 하나 이상이 무한 반복되는데, 이것은 플랫 파일을 위해 beanio에서 지원되지 않는다는 것입니다. 나는 beanio가 얼마나 자주 세그먼트가 반복되는지 추측 할 수 있기 때문에, 이것에 대한 좋은 이유가 있음을 이해합니다.처리중인 스트림에서 세그먼트에 대한 maxOccurs 속성을 읽을 수 있습니까?

그러나 반복 세그먼트가 발생하기 전에 각 세그먼트에 대한 반복 횟수가 파일에 있으므로 스트림에서 해당 숫자를 읽고 그 값을 채울 수있는 방법이 있는지 알아 내려고 노력하고 있습니다. 올바른 값을 사용하여 다음 세그먼트에 대한 "minOccurs"및 "maxOccurs"속성 지금은 길이 1 및 길이 2 세그먼트에서 "maxOccurs에"속성으로 필드의 값을 사용하는 방법이 필요

<beanio> 
    <stream name="employeeFile" format="fixedlength"> 
    <record name="record1" class="example.Record1"> 
     <field name="field1" length="10"/> 
     <field name="field2" length="2"/> 
     <field name="length1" length="2"/> 
     <segment name="list1" collection="list" minOccurs="1" maxOccurs="unbounded" class="example.List1"> 
     ... 
     </segment> 
     <field name="length2" length="2"/> 
     <segment name="list2" collection="list" minOccurs="1" maxOccurs="unbounded" class="example.List2"> 
     ... 
     </segment> 
    </record> 
    </stream> 
</beanio> 

: 같은 은 기본적으로 내 매핑 파일을 찾습니다. 나는이 행동을 취할 수있는 "공식적인"방법이 없다는 것을 확신하지만, 지금까지는 원격으로 우아한 해결책을 찾지 못했습니다.

내가 가진 아이디어는 파일에서 각 세그먼트에 대한 반복 횟수를로드 한 다음 매핑 파일에서 검색 대체를 수행하여 beanio에서로드하기 전에 매우 복잡하게 보일 수있는 절차를 만드는 것이 었습니다 일을하는 방법.

덕분에, Sönke

답변

3

대답 나 자신을 발견. 내가 찾고있는 기능을 소개 한 2.1이 아닌, 2.0 버전 용 beanio 레퍼런스 문서를 읽었습니다.

참조 문헌은 다음과 같이 명시

필드가 동일한 레코드에 선행 필드 에 기초하여 일정 회수 반복하면 occursRef 속성은 에게 제어 필드의 이름을 식별하기 위해 사용될 수있다 . 제어 필드가 부모 bean 오브젝트의 별도의 특성에 바인드 된 이 아니면 ignore = "true"로 지정하십시오. 다음 매핑 파일은 계정 필드 발생을 numberOfAccounts 필드에 종속되도록 구성하는 방법을 보여줍니다. 원하는 경우 minOccurs 및 maxOccurs가 여전히 으로 지정되어 참조 된 필드 발생 값의 유효성을 검사 할 수 있습니다.

그래서 하나를 사용할 수 있습니다

<field name="accounts" type="int" collection="list" occursRef="numberOfAccounts" /> 

가 의도 한 결과를 얻을 수 있습니다.

여기서는 실제로 필요하지 않으므로이 속성이 xml 스트림에서 작동하지 않는다고 생각합니다. 실수로 매핑 파일에이 오류를 추가하려고 시도했지만 적절한 오류 메시지 대신 예외가 발생했습니다.

관련 문제