Apache camel 使用bindy将csv转换为xml

Apache camel 使用bindy将csv转换为xml,apache-camel,bindy,Apache Camel,Bindy,我有这样的想法: 31 name 2018-11-01 2018-10-31 12:05:16 3 1 10 1.00 13.00 14 2 20 1.00 14.00 14 3 30 1.00 15.00 14 public class Order { private int id; private String name; private String date1;

我有这样的想法:

31  name    2018-11-01  2018-10-31 12:05:16 3   
1   10  1.00    13.00       14  
2   20  1.00    14.00       14  
3   30  1.00    15.00       14  
public class Order {

    private int id;
    private String name;
    private String date1;
    private int date2;
    private char numerOfFile;
    private List<OrderBody> orderBodyList;
}

public class OrderBody {

    private int lp;
    private int id;
    private BigDecimal priceByOne;
    private BigDecimal count;
    private int foreignId;
}
一行中的字段由制表符分隔

接下来我还有另一行,分开的标签。每行用“\n”分隔

我的课程应该是什么样子

我是这样做的:

31  name    2018-11-01  2018-10-31 12:05:16 3   
1   10  1.00    13.00       14  
2   20  1.00    14.00       14  
3   30  1.00    15.00       14  
public class Order {

    private int id;
    private String name;
    private String date1;
    private int date2;
    private char numerOfFile;
    private List<OrderBody> orderBodyList;
}

public class OrderBody {

    private int lp;
    private int id;
    private BigDecimal priceByOne;
    private BigDecimal count;
    private int foreignId;
}
公共类秩序{
私有int-id;
私有字符串名称;
私有字符串date1;
私家侦探2;
私人文件;
私有列表orderBodyList;
}
公共类OrderBody{
私人有限公司;
私有int-id;
私人大十进制价格比一;
私有大十进制计数;
外来的私人智力;
}

我建议使用Groovy DSL和MarkupBuilder


这实际上可以通过camel bindy使用FixedLengthRecord模型,并以tab作为分隔符来实现。模型中的最后一个字段似乎需要长度,但其他字段可以使用tab作为分隔符

下面是一个示例代码:

订单头:

import java.util.Date;

import org.apache.camel.dataformat.bindy.annotation.DataField;
import org.apache.camel.dataformat.bindy.annotation.FixedLengthRecord;

@FixedLengthRecord()
public class OrderHeader {

    @DataField(pos = 1, delimiter = "\t")
    private int id;

    @DataField(pos = 2, delimiter = "\t")
    private String name;

    @DataField(pos = 3, delimiter = "\t", pattern = "yyyy-MM-dd")
    private Date date1;

    @DataField(pos = 4, delimiter = "\t", pattern = "yyyy-MM-dd hh:mm:ss")
    private Date date2;

    @DataField(pos = 5, length = 1)
    private int numerOfFile;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getDate1() {
        return date1;
    }

    public void setDate1(Date date1) {
        this.date1 = date1;
    }

    public Date getDate2() {
        return date2;
    }

    public void setDate2(Date date2) {
        this.date2 = date2;
    }

    public int getNumerOfFile() {
        return numerOfFile;
    }

    public void setNumerOfFile(int numerOfFile) {
        this.numerOfFile = numerOfFile;
    }

}
订单:

import java.math.BigDecimal;

import org.apache.camel.dataformat.bindy.annotation.DataField;
import org.apache.camel.dataformat.bindy.annotation.FixedLengthRecord;

@FixedLengthRecord(header = OrderHeader.class)
public class Order {

    @DataField(pos = 1, delimiter = "\t")
    private int lp;

    @DataField(pos = 2, delimiter = "\t")
    private int id;

    @DataField(pos = 3, delimiter = "\t")
    private BigDecimal priceByOne;

    @DataField(pos = 4, delimiter = "\t")
    private BigDecimal count;

    @DataField(pos = 5, length = 2)
    private int foreignId;

    public int getLp() {
        return lp;
    }

    public void setLp(int lp) {
        this.lp = lp;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public BigDecimal getPriceByOne() {
        return priceByOne;
    }

    public void setPriceByOne(BigDecimal priceByOne) {
        this.priceByOne = priceByOne;
    }

    public BigDecimal getCount() {
        return count;
    }

    public void setCount(BigDecimal count) {
        this.count = count;
    }

    public int getForeignId() {
        return foreignId;
    }

    public void setForeignId(int foreignId) {
        this.foreignId = foreignId;
    }

    @Override
    public String toString() {
        StringBuilder str = new StringBuilder();
        str.append("...lp:").append(lp).append("\n");
        str.append("...id:").append(id).append("\n");
        str.append("...priceByOne:").append(priceByOne).append("\n");
        str.append("...count:").append(count).append("\n");
        str.append("...foreignId:").append(foreignId).append("\n");
        return str.toString();
    }
XmlOrder:

import java.util.List;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class XmlOrder extends OrderHeader {

    public XmlOrder() {
    }

    private List<Order> line;

    public XmlOrder(OrderHeader header, List<Order> lines) {
        this.setDate1(header.getDate1());
        this.setDate2(header.getDate2());
        this.setId(header.getId());
        this.setName(header.getName());
        this.setNumerOfFile(header.getNumerOfFile());
        this.setLines(lines);
    }

    public List<Order> getLines() {
        return line;
    }

    public void setLines(List<Order> lines) {
        this.line = lines;
    }

}
订单处理程序:

import java.util.List;
import java.util.Map;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.dataformat.bindy.fixed.BindyFixedLengthDataFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.stefan.test.fixedlengthtest.model.OrderHeader;
import com.stefan.test.fixedlengthtest.model.XmlOrder;

public class ProcessOrder implements Processor {

    private static final Logger logger = LoggerFactory.getLogger(ProcessOrder.class);

    @Override
    public void process(Exchange exchange) throws Exception {
        Map<String, OrderHeader> headermap = exchange.getIn()
                .getHeader(BindyFixedLengthDataFormat.CAMEL_BINDY_FIXED_LENGTH_HEADER, Map.class);

        OrderHeader header = headermap.get(OrderHeader.class.getName());

        logger.info("Processing order: {}", header.getId());
        logger.info("...date1: {}", header.getDate1());
        logger.info("...date2: {}", header.getDate2());
        logger.info("...numberOfFile: {}", header.getNumerOfFile());

        XmlOrder xmlorder = new XmlOrder(header, exchange.getIn().getBody(List.class));
        exchange.getIn().setBody(xmlorder);
    }
}
import java.util.List;
导入java.util.Map;
导入org.apache.camel.Exchange;
导入org.apache.camel.Processor;
导入org.apache.camel.dataformat.bindy.fixed.bindyfixedlingthdataformat;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
导入com.stefan.test.fixedlengthtest.model.OrderHeader;
导入com.stefan.test.fixedlengthtest.model.XmlOrder;
公共类ProcessOrder实现处理器{
私有静态最终记录器Logger=LoggerFactory.getLogger(ProcessOrder.class);
@凌驾
公共作废进程(Exchange)引发异常{
Map headermap=exchange.getIn()
.getHeader(BindyFixedLengthDataFormat.CAMEL\u BINDY\u FIXED\u LENGTH\u HEADER,Map.class);
OrderHeader=headermap.get(OrderHeader.class.getName());
info(“处理顺序:{}”,header.getId());
info(“…date1:{}”,header.getDate1());
info(“…date2:{}”,header.getDate2());
info(“…numberOfFile:{}”,header.getNumerOfFile());
XmlOrder XmlOrder=newxmlorder(头,exchange.getIn().getBody(List.class));
exchange.getIn().setBody(xmlorder);
}
}
此示例路由将输出如下内容:

[                          main] ProcessOrder                   INFO  Processing order: 31
[                          main] ProcessOrder                   INFO  ...date1: 2018-11-01T00:00:00.000+0200
[                          main] ProcessOrder                   INFO  ...date2: 2018-10-31T00:05:16.000+0200
[                          main] ProcessOrder                   INFO  ...numberOfFile: 3
[                          main] data-route                     INFO  Order: 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xmlOrder>
    <date1>2018-11-01T00:00:00+02:00</date1>
    <date2>2018-10-31T00:05:16+02:00</date2>
    <id>31</id>
    <name>name</name>
    <numerOfFile>3</numerOfFile>
    <lines>
        <count>13</count>
        <foreignId>14</foreignId>
        <id>10</id>
        <lp>1</lp>
        <priceByOne>1</priceByOne>
    </lines>
    <lines>
        <count>14</count>
        <foreignId>14</foreignId>
        <id>20</id>
        <lp>2</lp>
        <priceByOne>1</priceByOne>
    </lines>
    <lines>
        <count>15</count>
        <foreignId>14</foreignId>
        <id>30</id>
        <lp>3</lp>
        <priceByOne>1</priceByOne>
    </lines>
</xmlOrder>

[                          main] data-route                     INFO  DATA processed
[main]处理订单信息处理订单:31
[main]处理订单信息…日期1:2018-11-01T00:00:00.000+0200
[main]处理订单信息…日期2:2018-10-31T00:05:16.000+0200
[main]处理订单信息…文件编号:3
[main]数据路由信息顺序:
2018-11-01T00:00:00+02:00
2018-10-31T00:05:16+02:00
31
名称
3.
13
14
10
1.
1.
14
14
20
2.
1.
15
14
30
3.
1.
[main]已处理的数据路由信息数据

您可以在

中检查完整的源代码,您很可能无法在此处使用bindy,因为您的数据字段在第一行之后更改。最好的方法是编写一个简单的解析器bean来读取文件。@StefanR但这是怎么回事:案例6:带有页眉和页脚的固定长度记录,它不起作用吗?如果使用分隔符选项,则带有页眉的固定长度记录可能起作用。你需要对它进行测试才能找到答案。你能提供一些例子吗?我找不到任何东西:(非常感谢!是否可以用xml而不是java dsl来使用此路由?是的,可以将其实现为xml路由,但您仍然需要bindyDataFormat的java类。您能给我一个例子吗?您需要为这一点创建另一个问题。如果您只是在搜索,还有很多资源和教程可用让他们。。。。