Терминатор сегмента в BeanIO

Меня интересует свойство анализатора recordTerminator в BeanIO. Относится ли это и к сегментам, таким как "gmentTerminator"? А именно, у меня есть поток в формате фиксированной длины, содержащий одну запись с повторяемыми сегментами, и весь поток представляет собой одну строку. Следовательно, я установил recordTerminator="", но это все равно дает мне

==> Invalid 'state':  Expected minimum 1 occurrences
==> Invalid 'city':  Expected minimum 1 occurrences
==> Invalid 'street':  Invalid field length, expected 35 characters
==> Invalid 'zip':  Expected minimum 1 occurrences

Он не жалуется на поля, предшествующие повторяемому сегменту, и жалобы на поля в повторяемом сегменте не соответствуют порядку, определенному в файле mapping.xml, который выглядит следующим образом:

    <beanio  xmlns="http://www.beanio.org/2012/03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.beanio.org/2012/03 http://www.beanio.org/2012/03/mapping.xsd">
      <stream name="employeeFile" format="fixedlength">
        <parser>
            <property name="recordTerminator" value="" />
        </parser>  
        <record name="employee" class="example.Employee">
          <field name="firstName" length="35" />
          <field name="lastName" length="35" />
          <field name="title" length="35" />
          <field name="salary" length="35" />
          <segment name="addressList" collection="list" minOccurs="1" maxOccurs="unbounded" class="example.Address">
            <field name="street" length="35" />
            <field name="city" length="35" />
            <field name="state" length="35" />      
            <field name="zip" length="10" />
          </segment>
        </record> 
      </stream>
    </beanio>

Реализация класса выглядит следующим образом:

    package example;        
    public class Employee {
        String firstName;
        String lastName;
        String title;
        String salary;
        List<Address> addressList;

        // getters and setters not shown...
    }       

    package example;
    public class Address {
        private String street;
        private String city;
        private String state;
        private String zip;

        // getters and setters not shown...
    }       

Если я удаляю все предыдущие поля в повторяющийся сегмент как из mapping.xml, так и из входной строки, оставшаяся строка должным образом не маршалируется, а впоследствии маршалируется в json, я даже не меняю реализацию классов Java, поэтому предыдущие поля остаются неинициализированными, так как ожидается, но правильно распечатан после сортировки. Где я неправ?

ОК, мой верблюжий код весной xml, выглядит так:

    <route id="simple-route">
        <!-- from id="request-file" uri="file://C:/mqdocuments/?fileName=response464.txt"/-->
        <from id="request-file" uri="file://C:/mqdocuments/?fileName=request464.txt"/>
        <log id="route-log-request" message="request: ${body}"/>
        <setHeader headerName="CamelJmsDestinationName" id="_setHeader1">
            <constant>queue://QM_TEST/INPUTQ?targetClient=1</constant>
        </setHeader>
        <to id="_to1" pattern="InOut" uri="websphere:queue:SYSTEM.DEFAULT.LOCAL.QUEUE?useMessageIDAsCorrelationID=true&amp;replyTo=REPLYQ"/>
        <log id="route-log-response" message="response: ${body}"/>
                    <transform>
                        <simple>${body}\0</simple>
                </transform>
        <unmarshal ref="parseTransactions464"/>
        <marshal ref="jack"/>
        <log id="route-log-json" message="jackson: ${body}"/>
</route>

Таким образом, в основном, когда я раскомментирую входные данные из файла, в котором сохраняется ответ, и помещаю в комментарии mq в конечную точку, unmarshalling - это нормально, но если я помещаю запрос в очередь и получаю ответ, то я надеюсь исправить проблему преобразованием, которое просто добавляет символ EOF, потому что без него это дает мне ошибку, о которой я сообщил в первую очередь. И преобразование не помогает, потому что я не знаю, как писать EOF (ascii 26), но даже если я это выясню, я не уверен, что это поможет.

2 ответа

Решение

Я пытался выявить проблему, но в итоге я понял, что должен был установить кодировку с атрибутом кодирования beanio dataFormat, что я не смог сделать из-за этого дефекта:

http://camel.465427.n5.nabble.com/Re-Exhausted-after-delivery-attempt-1-caught-java-lang-NullPointerException-charset-tc5817807.html

http://camel.465427.n5.nabble.com/Exhausted-after-delivery-attempt-1-caught-java-lang-NullPointerException-charset-tc5817815.html

https://issues.apache.org/jira/browse/CAMEL-12284

Наконец, Клаус Ибсен дал мне указание использовать такой обходной путь:

    <bean class="org.apache.camel.dataformat.beanio.BeanIODataFormat" 
          id="some_bean_id"> 
        <property name="encoding" value="UTF-8"/> 
        <property name="mapping" value="mapping.xml"/> 
        <property name="streamName" value="some_stream_name"/> 
    </bean> 

Я собираюсь попробовать это как ответ, к сожалению, я не могу проверить это, у меня ничего не настроено для использования с Camel. Сначала я бы не стал менять по умолчанию recordTerminator значение для BeanIO и оставьте его, чтобы использовать по умолчанию, который является любым из CR, LF или же CRLF,

Затем при преобразовании сообщения я добавлю новую строку (\n) вместо \0, Я не совсем понимаю, почему вы хотели бы использовать EOF персонаж, если у вас есть контроль над ним. Вместо:

<transform>
  <simple>${body}\0</simple>
</transform>

Я бы пошел на:

<transform>
  <simple>${body}\n</simple>
</transform>

См. Раздел "Использование новых строк или вкладок в XML DSL", расположенный в нижней части страницы:

Использование новых строк или вкладок в XML DSL

Доступно с верблюда 2.9.3

С верблюда 2.9.3: проще указать новые строки или вкладки в XML DSL, так как теперь вы можете избежать значения xml

<transform> <simple>The following text\nis on a new line</simple></transform>
Другие вопросы по тегам