Используя верблюда apache, smooks и flatpack
Я пишу маршрут, используя верблюда и smooks, с производителем в качестве репозитория JPA, который создает список объектов JPA, которые мне нужно отправить на сервер sftp в виде файла с фиксированной шириной.
Вот то, что я думаю, требуется, чтобы это произошло
- Репозиторий, который использует JPA для создания списка объектов (у меня есть это)
- Smooks to flatpack mapping, которая берет xml-версию списка, упомянутого выше, и преобразует его в файл с фиксированной шириной
- Верблюжий маршрут, который начинается с хранилища и заканчивается отправкой файла через sftp:
Вот код, который у меня есть для этого:
public class RetirementRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
onException(Throwable.class)
.maximumRedeliveries(3)
.useExponentialBackOff()
.backOffMultiplier(4)
.logRetryAttempted(true)
.handled(true)
.log(LoggingLevel.ERROR, "Error transmitting file to miliman")
.to("log:org.fuwt?level=ERROR&showAll=true");
//define the fixed width mapping
FlatpackDataFormat df = new FlatpackDataFormat();
df.setDefinition(new ClassPathResource("META-INF/smooks/fuintegration/retirement-fixed-width-mapping.xml"));
df.setFixed(true);
df.setIgnoreFirstRecord(false);
from("bean:retirementRepository?method=getRetirementMembers")
.to("log:org.fuwt?level=INFO")
.transacted("CRM_PROPAGATION_REQUIRED")
.routeId("retirement_member_exchange")
.aggregate(property("CamelCreatedTimestamp"), new RetirementAggregationStrategy()).completionFromBatchConsumer()
.marshal(df).log("log:org.fuwt?level=ERROR&showAll=true")
.to("file://Users/smohamed/tests/?fileName=marshal.test.txt");
}
}
Однако, когда я запускаю модульный тест, я получаю следующую ошибку:
ArrayList cannot be converted to RetirementMember
что, я думаю, означает, что flatpack не знает, что делать со списком, и должен работать с объектом для каждого объекта.
Следовательно, я ищу сопоставление smooks, похожее на шаблон freemaker, но вместо шаблона freemaker я хочу использовать определения столбцов flatpack:
<?xml version='1.0'?>
<!DOCTYPE PZMAP SYSTEM "flatpack.dtd" >
<PZMAP>
<COLUMN name="ssn" length="11" />
<COLUMN name="lastName" length="20" />
<COLUMN name="firstName" length="15" />
</PZMAP>
Каков наилучший способ сделать это? Существует не так много документации, и я искал в течение нескольких недель
Спасибо
Сэм
1 ответ
Оказывается, что для формата данных Flatpack требуется не объект Java ArrayList, а объект List>, где Map содержит имя определения каждого столбца в файле отображения ZMAP-XML и объект, который он обозначает, поэтому поле firstname например будет на карте как map.put("firstname","Sam")
,
Я узнал об этом, загрузив исходный код Apache Camel и посмотрев модульные тесты для Flatpack, после чего смог найти свой маршрут на работу.