2015-03-03 89 views
0

我有一个包含一组用户的大型CSV文件。我正在寻找一种简单的方法来读取文件,映射到一个Java对象,并将该对象传递给将对该对象执行一些操作的处理器。 所以我打上表示CSV文件注释一个Java bean:骆驼CSV转换为Java对象

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

} 

然后我就开始编写一个骆驼路线,但我不能找出如何通过CSV为Java对象端点:

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

你可以使用一个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。首先,添加这种“豆”类:

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

而现在,Camel Bean Binding发生在交易所里“在”体并将其作为参数传递给你的bean(避免整个exchange.getIn().getBody()部分)。

​​

如果要使用不同的参数,以你的bean,您可以使用方法调用与simple表达式,像这样:

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

谢谢,我实现了一个简单的处理器,但是在为了检索我不得不挖掘到Body中的对象,然后到包含HashMaps的数据的ArrayList中。有没有更简单的方法来从处理器检索POJO? '公共类SimpleProcessor实现处理器{ \t公共无效处理(交易交换)抛出异常{ \t \t ArrayList的列表=(ArrayList的)exchange.getIn()getBody();对于(HashMap地图:list){ \t \t \t Iterator iter = map.entrySet()。iterator(); (iter.hasNext()){ \t \t \t while(iter.hasNext()){ \t \t System.out.println(“user”+ iter.next()); \t \t} }' \t \t \t \t \t}} 再次 – user2824073 2015-03-03 12:18:26

+0

谢谢显示得很清楚如何解决这个问题。 – user2824073 2015-03-03 13:03:56

+0

不用担心,骆驼好运,这是一个很棒的框架,一旦你使用它一段时间:) – vikingsteve 2015-03-03 13:04:45