Java 平面文件到Pojo,带oneToMany unmarshal不';行不通

Java 平面文件到Pojo,带oneToMany unmarshal不';行不通,java,file-io,apache-camel,bindy,Java,File Io,Apache Camel,Bindy,我使用以下测试程序 问题是代码能够将pojo结构封送到平面CSV文件中,但无法将文件数据解组回pojo。 apache camel bindy:2.13.0 订购Java文件: package test.bindy.model; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.camel.dataformat.bindy.annotation.CsvReco

我使用以下测试程序 问题是代码能够将pojo结构封送到平面CSV文件中,但无法将文件数据解组回pojo。

apache camel bindy:2.13.0

订购Java文件:

package test.bindy.model;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.camel.dataformat.bindy.annotation.CsvRecord;
import org.apache.camel.dataformat.bindy.annotation.DataField;
import org.apache.camel.dataformat.bindy.annotation.OneToMany;

@CsvRecord(separator = ",")
public class Order {

    @DataField(pos = 1)
    private String clOrdID;

    @DataField(pos = 2)
    private String handlInstId;

    @DataField(pos = 3)
    private int orderQty;

    @DataField(pos = 4)
    private String ordType;

    @DataField(pos = 5)
    private String rule80A;

    @DataField(pos = 6, pattern = "yyyyMMdd-HH:mm:ss")
    private Date sendingTime;

    @DataField(pos = 7)
    private String side;

    @DataField(pos = 8)
    private String symbol;

    @DataField(pos = 9)
    private String timeInForce;

    @DataField(pos = 10, pattern = "yyyyMMdd-HH:mm:ss")
    private Date transactTime;

    @DataField(pos = 11)
    private String message;

    @DataField(pos = 12)
    private String OnBehalfOfCompID;

    @DataField(pos = 13)
    private String securityExchange;

    @OneToMany(mappedTo = "test.bindy.model.Item")
    private List<Item> items;

    public void addItem(Item item) {
        if (null == items) {
            items = new ArrayList<Item>();
        }
        items.add(item);
    }

    public String getClOrdID() {
        return clOrdID;
    }

    public void setClOrdID(String clOrdID) {
        this.clOrdID = clOrdID;
    }

    public String getHandlInstId() {
        return handlInstId;
    }

    public void setHandlInstId(String handlInstId) {
        this.handlInstId = handlInstId;
    }

    public int getOrderQty() {
        return orderQty;
    }

    public void setOrderQty(int orderQty) {
        this.orderQty = orderQty;
    }

    public String getOrdType() {
        return ordType;
    }

    public void setOrdType(String ordType) {
        this.ordType = ordType;
    }

    public String getRule80A() {
        return rule80A;
    }

    public void setRule80A(String rule80a) {
        rule80A = rule80a;
    }

    public Date getSendingTime() {
        return sendingTime;
    }

    public void setSendingTime(Date sendingTime) {
        this.sendingTime = sendingTime;
    }

    public String getSide() {
        return side;
    }

    public void setSide(String side) {
        this.side = side;
    }

    public String getSymbol() {
        return symbol;
    }

    public void setSymbol(String symbol) {
        this.symbol = symbol;
    }

    public String getTimeInForce() {
        return timeInForce;
    }

    public void setTimeInForce(String timeInForce) {
        this.timeInForce = timeInForce;
    }

    public Date getTransactTime() {
        return transactTime;
    }

    public void setTransactTime(Date transactTime) {
        this.transactTime = transactTime;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getOnBehalfOfCompID() {
        return OnBehalfOfCompID;
    }

    public void setOnBehalfOfCompID(String onBehalfOfCompID) {
        OnBehalfOfCompID = onBehalfOfCompID;
    }

    public String getSecurityExchange() {
        return securityExchange;
    }

    public void setSecurityExchange(String securityExchange) {
        this.securityExchange = securityExchange;
    }

    @Override
    public String toString() {
        return "Order [clOrdID=" + clOrdID + ", handlInstId=" + handlInstId + ", orderQty=" + orderQty + ", ordType=" + ordType + ", rule80A=" + rule80A
                + ", sendingTime=" + sendingTime + ", side=" + side + ", symbol=" + symbol + ", timeInForce=" + timeInForce + ", transactTime=" + transactTime
                + ", message=" + message + ", OnBehalfOfCompID=" + OnBehalfOfCompID + ", securityExchange=" + securityExchange + "]";
    }

    public List<Item> getItems() {
        return items;
    }

    public void setItems(List<Item> items) {
        this.items = items;
    }

}
package test.bindy.model;

import java.util.ArrayList;
import java.util.List;

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

  public class Item {

    @DataField(pos = 14)
    private String idSource;

    @DataField(pos = 15)
    private String itemCode;

    @DataField(pos = 16)
    private String categoryCode;

    @OneToMany(mappedTo = "test.bindy.model.InventoryItem")
    private List<InventoryItem> inventoryItems;

    public void addInventoryItem(InventoryItem ii) {
        if (null == inventoryItems) {
            inventoryItems = new ArrayList<InventoryItem>();
        }
        inventoryItems.add(ii);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Item other = (Item) obj;
        if (categoryCode == null) {
            if (other.categoryCode != null)
                return false;
        } else if (!categoryCode.equals(other.categoryCode))
            return false;
        if (idSource == null) {
            if (other.idSource != null)
                return false;
        } else if (!idSource.equals(other.idSource))
            return false;
        if (itemCode == null) {
            if (other.itemCode != null)
                return false;
        } else if (!itemCode.equals(other.itemCode))
            return false;
        return true;
    }

    public String getCategoryCode() {
        return categoryCode;
    }

    public String getIdSource() {
        return idSource;
    }

    public String getItemCode() {
        return itemCode;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((categoryCode == null) ? 0 : categoryCode.hashCode());
        result = prime * result + ((idSource == null) ? 0 : idSource.hashCode());
        result = prime * result + ((itemCode == null) ? 0 : itemCode.hashCode());
        return result;
    }

    public void setCategoryCode(String categoryCode) {
        this.categoryCode = categoryCode;
    }

    public void setIdSource(String idSource) {
        this.idSource = idSource;
    }

    public void setItemCode(String itemCode) {
        this.itemCode = itemCode;
    }
}
package test.bindy.model;

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

public class InventoryItem {
    @DataField(pos = 17)
    private Long invetoryId;
    @DataField(pos = 18)
    private String location;
    @DataField(pos = 19)
    private Double qty;
    @DataField(pos = 20)
    private String message;

    public Long getInvetoryId() {
        return invetoryId;
    }

    public String getLocation() {
        return location;
    }

    public String getMessage() {
        return message;
    }

    public Double getQty() {
        return qty;
    }

    public void setInvetoryId(Long invetoryId) {
        this.invetoryId = invetoryId;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public void setQty(Double qty) {
        this.qty = qty;
    }
}
编组和解编组的测试程序:

import test.bindy.model.InventoryItem;
import test.bindy.model.Item;
import test.bindy.model.Order;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
import org.apache.camel.dataformat.bindy.csv.BindyCsvDataFormat;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.impl.DefaultExchange;
import org.apache.camel.spi.DataFormat;

public class Test3 {
    static File file;
    static DataFormat bindy;
    static CamelContext context;
    static Exchange exchange;
    static {
        file = new File("c:/temp/bindy/test.txt");
        bindy = new BindyCsvDataFormat("test.bindy.model");
        context = new DefaultCamelContext();
        exchange = new DefaultExchange(context);
    }

    public static void main(String[] args) throws Exception {
        System.out.println("Marshalling POJOs...");
        testMarshal();
        System.out.println("Success...1");
        System.out.println("Unmarshalling POJOs...");
        testUnMarshal();
        System.out.println("Success...2");
    }

    @SuppressWarnings("unchecked")
    static void testUnMarshal() throws Exception {
        InputStream is = new FileInputStream(file);
        List<Map<String, Object>> models = (List<Map<String, Object>>) bindy.unmarshal(exchange, is);
        System.out.println("Output....");
        for (Map<String, Object> m : models) {
            for (String k : m.keySet()) {
                System.out.println(m.get(k));
            }
        }
    }

    static void testMarshal() throws Exception {
        List<Map<String, Object>> models = new ArrayList<Map<String, Object>>();
        models.add(generateData());
        OutputStream os = new FileOutputStream(file);
        bindy.marshal(exchange, models, os);
    }

    static Map<String, Object> generateData() {
        Map<String, Object> model = new HashMap<String, Object>();
        Order order = new Order();
        order.setClOrdID("892329");
        order.setOnBehalfOfCompID("Amazon");
        order.setOrderQty(199);
        order.setSymbol("GARMIN");
        order.setMessage("Immediate Delievery");
        order.setOrdType("EXPRESS");
        order.setRule80A("89893B");
        order.setTimeInForce("5");
        order.setSecurityExchange("INS");
        order.setSendingTime(new Date());
        Item item = new Item();
        item.setIdSource("1");
        item.setItemCode("FORERUNNER620");
        item.setCategoryCode("SPORTS");
        InventoryItem ii = new InventoryItem();
        ii.setInvetoryId(1000L);
        ii.setQty(1D);
        ii.setLocation("NY");
        item.addInventoryItem(ii);/*
                                    ii = new InventoryItem();
                                    ii.setInvetoryId(1001L);
                                    ii.setQty(1D);
                                    ii.setLocation("WI");
                                    ii.setMessage("Promotion");
                                    item.addInventoryItem(ii);*/
        //
        order.addItem(item);
        //
        item = new Item();
        item.setIdSource("2");
        item.setItemCode("HRM-RUN");
        item.setCategoryCode("SPORTS");
        ii = new InventoryItem();
        ii.setInvetoryId(1003L);
        ii.setQty(1D);
        ii.setLocation("FL");
        item.addInventoryItem(ii);
        order.addItem(item);
        //
        item = new Item();
        item.setIdSource("3");
        item.setItemCode("FOOTPAD");
        item.setCategoryCode("SPORTS");
        ii = new InventoryItem();
        ii.setInvetoryId(1004L);
        ii.setQty(1D);
        ii.setLocation("AZ");
        item.addInventoryItem(ii);
        order.addItem(item);
        model.put("0", order);
        return model;
    }
}
导入test.bindy.model.InventoryItem;
导入test.bindy.model.Item;
导入test.bindy.model.Order;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.io.InputStream;
导入java.io.OutputStream;
导入java.util.ArrayList;
导入java.util.Date;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入org.apache.camel.CamelContext;
导入org.apache.camel.Exchange;
导入org.apache.camel.dataformat.bindy.csv.BindyCsvDataFormat;
导入org.apache.camel.impl.DefaultCamelContext;
导入org.apache.camel.impl.DefaultExchange;
导入org.apache.camel.spi.DataFormat;
公共类Test3{
静态文件;
静态数据格式bindy;
静态语境;
静态交换;
静止的{
file=新文件(“c:/temp/bindy/test.txt”);
bindy=新的BindyCsvDataFormat(“test.bindy.model”);
上下文=新的DefaultCamelContext();
exchange=新的默认exchange(上下文);
}
公共静态void main(字符串[]args)引发异常{
System.out.println(“编组POJO…”);
testMarshal();
System.out.println(“成功…1”);
System.out.println(“解组POJO…”);
testUnMarshal();
System.out.println(“Success…2”);
}
@抑制警告(“未选中”)
静态void testUnMarshal()引发异常{
InputStream is=新文件InputStream(文件);
List models=(List)bindy.unmarshal(exchange,is);
System.out.println(“输出…”);
用于(地图m:模型){
对于(字符串k:m.keySet()){
系统输出println(m.get(k));
}
}
}
静态void TestMarshall()引发异常{
列表模型=新的ArrayList();
models.add(generateData());
OutputStream os=新文件OutputStream(文件);
封送(交换、模型、操作系统);
}
静态映射生成数据(){
映射模型=新的HashMap();
订单=新订单();
setClOrdID命令(“892329”);
order.setOnBehalfOfCompID(“亚马逊”);
订单.设置订单数量(199);
order.setSymbol(“GARMIN”);
order.setMessage(“立即交货”);
order.setOrdType(“EXPRESS”);
第80A号法令(“89893B”);
订单。设置时间信息(“5”);
order.setSecurityExchange(“INS”);
order.setSendingTime(新日期());
项目=新项目();
项目.setIdSource(“1”);
项目。setItemCode(“ForerRunner620”);
项目.设置类别代码(“运动”);
InventoryItem ii=新的InventoryItem();
ii.setInvetoryId(1000L);
ii.设置数量(1D);
ii.设定位置(“纽约”);
项目.补充项目(二)/*
ii=新的库存项目();
ii.setInvetoryId(1001L);
ii.设置数量(1D);
ii.设定位置(“WI”);
ii.setMessage(“促销”);
项目.补充项目(二)*/
//
订单.附件(项目);
//
项目=新项目();
项目.setIdSource(“2”);
item.setItemCode(“HRM-RUN”);
项目.设置类别代码(“运动”);
ii=新的库存项目();
ii.setInvetoryId(1003L);
ii.设置数量(1D);
ii.设定位置(“FL”);
项目.补充项目(二);
订单.附件(项目);
//
项目=新项目();
项目.setIdSource(“3”);
项目。设置项目代码(“足垫”);
项目.设置类别代码(“运动”);
ii=新的库存项目();
ii.Setinvoryid(1004L);
ii.设置数量(1D);
ii.设定位置(“AZ”);
项目.补充项目(二);
订单.附件(项目);
模型。放置(“0”,订单);
收益模型;
}
}

有什么线索可以解释为什么解组在封送操作生成的同一个文件上不起作用吗?

很难知道cvs文件中有多少InventoryItem,因为cvs文件没有提供这方面的任何信息。

得出结论,Bindy不支持多级pojo结构。我要和比尼奥一起前进。这确实支持多级,但需要映射文件定义,而不是POJO上的批注。您是否尝试将数据字段批注与OneToMany放在一起

我解决了类似的问题,如下所示:

@OneToMany
@DataField(pos=2)
private List<Layout> layouts;

您可以自定义代码方法generateData()并签出。事实上,一级一对多关系并不存在;也不行!
public class Layout {
  @DataField(pos=2)
  private String id;
}