EDIT1
我不确定标题是否最适合问题所以如果有任何更多的标题,请建议
我正在尝试使用camel,我必须从文件系统中获取一些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();
}
}
在这种方法中,camel csv unmarshaller会将csv文件转换为java list List<List<String>>
我编写了一个java转换器CSVConverterBean
,它将遍历列表并设置由jaxb 2.x生成的相应java对象中的值,最终对象被封送到xml并保存文件。
如果将来出现任何更改映射的请求,我们需要在CSVConverterBean
中进行修改,并且需要重新编译并且需要重新分发我们想避免。
我的问题是,有没有什么办法可以将Camel给出的java List中的值映射到JaxB生成的各个java类,这样就可以了解重新编译java代码的需要。
答案 0 :(得分:0)
您可以提供“从 - 到”类型的配置文件,以使用Bean属性映射CSV数据的列,并编写算法以读取该文件并处理转换。
您可以使用.properties文件:
# mapping.properties
column0=propertyOne
column1=propertyTwo
对于CSV中的每一列,您都会从属性文件中获取值,并找到应设置值的属性。
int columnIndex = 0;
for(String column : csvColumns) {
String property = findProperty(columnIndex);
reflectionUtil.setValue(object, property, column);
columnIndex++;
}
这可能会给你一些提示。
每当您的数据发生变化时,您只需要更改属性文件,而不是类。
答案 1 :(得分:0)
使用Bruno的想法,但是从csv文件的标题行中读取属性名称。
答案 2 :(得分:0)
我用dom4j.camel解决了这个问题,给了我回csv作为列表&gt;首先,我阅读了标题,然后将这些标题和XML标记以及值作为运行时的值。