2011-07-21 43 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文件的标题行中读取属性名称。