2011-07-21 68 views
1

EDIT1映射Java對象到Java Bean的聲明方式

我不知道,如果標題是最好的問題,所以如果有更多的orinted標題請建議

我正手在駱駝在這裏我必須從文件系統獲取一些csv文件,並需要將其轉換爲XML格式,並把它放在一些其他系統

我用駱駝這個在這裏是我的示例代碼POC

import org.apache.camel.CamelContext; 

import org.apache.camel.Exchange; 

import org.apache.camel.Message; 

import org.apache.camel.Processor; 

import org.apache.camel.builder.RouteBuilder; 

import org.apache.camel.impl.DefaultCamelContext; 
import com.poc.convertor.CSVConverterBean; 

    public class TestPOC { 

      public static void main(String args[]) throws Exception { 
      CamelContext context = new DefaultCamelContext(); 
      context.addRoutes(new RouteBuilder() { 

        public void configure() { 
          from("file:data/csv?noop=true").unmarshal().csv().bean(new CSVConverterBean(),"processCSVInvoice").to("file:data/csvoutput?fileName=test.xml").marshal("jaxb"); 


        } 

       }); 
       context.start(); 
       Thread.sleep(1000); 
       context.stop(); 
      } 

} 

在這種方法中駱駝CSV解組器將隱蔽csv文件中Java列表List<List<String>> 我寫一個Java變換器CSVConverterBean這將遍歷該列表,並設置在相應的Java對象的值通過JAXB 2的產生。 x,最終對象被封送到xml中並且文件正在保存。

一切正在正常工作只有一個問題,如果將來出現任何更改映射的請求,我們需要在CSVConverterBean中進行修改,並且此java文件需要重新編譯並需要重新分配,我們想要避免。

我的問題是,有沒有什麼辦法可以將Camel給出的java列表中的值映射到由JaxB生成的相應java類,以便可以避免重編譯java代碼的需要。

回答

0

我已經解決了這個問題,使用dom4j.camel給了我csv作爲列表>,並且首先我讀了標題,並且在運行時將這些標題和XML標記和值作爲尊重值。

0

您可以提供一種「從 - 到」類型的配置文件,將CSV數據的列與您的Bean屬性進行映射,並編寫算法來讀取該文件並處理轉換。

你可以做一個屬性文件:

# mapping.properties 
column0=propertyOne 
column1=propertyTwo 

對於您的CSV每一列,你從屬性文件的價值,找到哪個屬性應該設置的值。

int columnIndex = 0; 
for(String column : csvColumns) { 
    String property = findProperty(columnIndex); 
    reflectionUtil.setValue(object, property, column); 
    columnIndex++; 
} 

這可能會給你一些提示。

每當數據發生變化時,您只需要更改屬性文件而不是類。

0

使用Bruno的想法,但從csv文件的標題行中讀取屬性名稱。