Camel CSV转换为Java对象

时间:2015-03-03 10:30:54

标签: apache-camel

我有一个包含一组用户的大型CSV文件。我正在寻找一种简单的方法来读取文件,映射到Java对象并将此Object传递给处理器,该处理器将对Object执行某些操作。 所以我标记了一个带有代表CSV文件的注释的Java bean:

@CsvRecord(separator = ",")
public class User {
    @DataField(pos = 1)
    private String username;
    @DataField(pos = 2)
    private String group;

}

然后我开始编写Camel Route的代码,但是我无法找到如何将CSV作为Java Object传递给端点:

CamelContext context = new DefaultCamelContext();
    final DataFormat bindy = new BindyCsvDataFormat("com.sample.model");
    context.addRoutes(new RouteBuilder() {
        public void configure() {
            from("file:/usr/camel/in?noop=true").
            unmarshal(bindy)
            .to("??????");
        }
}); 

目标端点应该是接收用户对象的java类。有可能这样做吗?感谢

1 个答案:

答案 0 :(得分:1)

您可以使用Processor的实例来处理POJO:

    Processor myProcessor = new Processor() {
        @Override
        public void process(Exchange exchange) throws Exception {
            // do something here
        }
    };

    from("file:/usr/camel/in?noop=true")
    .unmarshal(bindy)
    .process(myProcessor);

解决方案2:您可以使用bean。首先,添加这个" bean"类:

public class MyBean {
    public void process(List<String> list) {
        System.out.println("list contains " + list.size() + " elements.");
    }
}

现在,Camel Bean Binding接受&#34; In&#34;在交换机上的主体并将其作为参数提供给您的bean(避免整个exchange.getIn().getBody()部分)。

from("file:/usr/camel/in?noop=true")
.unmarshal(bindy)
.bean(new MyBean())

如果要对bean使用不同的参数,可以使用带simple表达式的方法调用,如下所示:

.bean(new MyBean(), "process(${body.get(0).etc...})")