Меня интересует свойство парсера recordTerminator BeanIO. Это относится и к сегментам, например к «segmentTerminator»? А именно, у меня есть поток формата фиксированной длины, содержащий одну запись с повторяющимися сегментами, и весь поток представляет собой одну строку. Следовательно, я установил 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, поэтому предыдущие поля остаются неинициализированными, поскольку ожидается, но правильно распечатывается после сортировки. Где я неправ?
ОК, мой верблюжий код в spring 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&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 к конечной точке, демаршаллинг в порядке, но если я помещаю запрос в очередь и получаю ответ, то я надеюсь исправить проблему преобразованием, которое просто добавляет символ EOF, потому что без него это дает мне ошибку, о которой я сообщил в первую очередь. И преобразование не помогает, потому что я не знаю, как написать EOF (ascii 26), но даже если я это выясню, я не уверен, что это поможет.