2012-01-19 128 views
3

我正在使用camel和smooks編寫路由,生成器作爲JPA存儲庫生成JPA對象列表,我需要將它作爲固定寬度文件發送到sftp服務器。使用apache camel,smooks和flatpack

這是我想發生

  1. 它使用JPA生產對象的列表(我有這個)
  2. 一個Smooks對扁平封裝映射這需要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 

我認爲這意味着扁平封裝不知道該怎麼辦該列表,並需要在每個對象的基礎上處理對象。

因此,我正在尋找的是類似freemaker的模板的Smooks映射,但不是一個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> 

什麼是最好的方式去對這個?沒有太多的資料可用,我一直在尋找周

感謝

山姆

回答

2

原來的扁平數據格式要求不是Java的ArrayList對象,而是一個列表>對象其中Map包含ZMAP-XML映射文件中的每個列的定義名稱以及它所代表的對象,因此字段firstname例如將在地圖中爲map.put("firstname","Sam")

我通過下載apache camel源代碼,然後查看Flatpack的單元測試發現了這一點,在此之後,我才得以開始工作。