Отображение значения ключа в записи фиксированной длины BeanIO

У меня есть следующая спецификация для файла данных фиксированной длины (см. Спецификацию типа записи C, стр. 4)

вторая часть длиной 1800 символов, состоящая из таблицы из 75 элементов, которые должны использоваться для отображения единственных данных, присутствующих в сообщении; каждый из этих элементов состоит из кода поля из 8 символов и значения поля из 16 символов

Это означает, что первые 89 символов (опущены в приведенном выше резюме) являются старой старой фиксированной длины, а затем, для оставшихся 1800, я должен разбить их на группы пар ключ-значение, каждая из которых насчитывает до 24 символов. Пробелы обрезаются, а пустые пары в процессе не учитываются.

В идеале мой боб может быть построен как

public class RecordC{

    private List<Pair<String, String>> table = new ArrayList<>(MAX_TABLE_SIZE); //I don't want to use Map **yet**

}

Что-то может быть, например, Apache Common's Pair<String,String> или что-нибудь подходящее для картографирования KVP.

Я понимаю, что могу создать целый TypeHandler, который занимает все 1800 байт, но я хотел использовать всю мощь BeanIO.

Вот что я сделал до сих пор

    <record name="RECORD_C" class="it.csttech.ftt.data.beans.ftt2017.RecordC" order="3" minOccurs="1" maxOccurs="1" maxLength="2000">
        <field name="tipoRecord" rid="true" at="0" ignore="true" required="true" length="1" lazy="true" literal="C" />

        <field name="cfContribuente" at="1" length="16" align="left" trim="true" lazy="true" />
        <field name="progressivoModulo" at="17" length="8" padding="0" align="right" trim="true" lazy="true" />
        <field name="spazioDisposizioneUtente" at="25" length="3" align="left" trim="true" lazy="true" />
        <field name="spazioUtente" at="53" length="20" align="left" trim="true" lazy="true" />

        <field name="cfProduttoreSoftware" at="73" length="16" align="left" trim="true" lazy="true" />

        <segment name="table" collection="list" lazy="true" class="org.apache.commons.lang3.tuple.ImmutablePair">
            <field name="key" type="java.lang.String" at="0" length="8" trim="true" lazy="true" setter="#1" />
            <field name="value" type="java.lang.String" at="8" length="16" trim="true" lazy="true" setter="#2" />
        </segment>

        <field name="terminatorA" at="1897" length="1" rid="true" literal="A" ignore="true" />
    </record>

К сожалению, это не работает в тестировании. Я получаю только одну запись в списке, декодированную в позиции [0-7] и [8-23] вместо ожидаемой [89-113][114-???][....][....]

Вопрос: как мне объявить в BeanIO повторяющиеся поля фиксированной длины?

1 ответ

В настоящее время я решил свою проблему, удалив все at атрибуты в спецификациях RecordC. Как я выяснил, атрибут "at" является абсолютным по отношению к записи и не относится к повторяющемуся сегменту. Однако это вынудило меня добавить некоторые игнорируемые поля в демоверсию по исключительной цене нескольких ignores.

Я протестирую сортировку на официальном контроллере, как только получу данные

Другие вопросы по тегам