3

我正在使用 camel 和 smooks 编写路线,生产者作为 JPA 存储库,生成 JPA 对象列表,我需要将其作为固定宽度文件发送到 sftp 服务器。

这是我认为发生这种情况所必需的

  1. 使用 JPA 生成对象列表的存储库(我有这个)
  2. 一个 smooks 到 flatpack 的映射,它采用上述列表的 xml 版本,并将其转换为固定宽度的文件
  3. 以存储库开始并以通过 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 不知道如何处理列表,并且需要在每个对象的基础上工作。

因此,我正在寻找的是类似于 freemaker 模板的 smooks 映射,但我想使用 flatpack 的列定义而不是 freemaker 模板:

<?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>

解决此问题的最佳方法是什么?没有太多可用的文档,我已经搜索了好几个星期

谢谢

山姆

4

1 回答 1

2

事实证明,Flatpack 数据格式不需要 java ArrayList 对象,而是 List> 对象,其中 Map 包含 ZMAP-XML 映射文件中每一列的定义名称,以及它所代表的对象,因此字段 firstname例如将在地图中作为map.put("firstname","Sam").

我通过下载 apache camel 源代码并查看 Flatpack 的单元测试发现了这一点,之后我就可以开始工作了。

于 2012-01-23T19:27:24.507 回答