从CSV填充复杂bean

时间:2011-03-04 19:37:36

标签: java apache-commons javabeans

我正在研究一个具有大量科学,领域特定知识的计算项目。因此,我们的客户已经为我们提供了填充了输入和输出的CSV文件。我们可以通过仔细地将所有这些数据复制到设置和断言来编写单元测试,但是我们希望避免这种情况,因为它是纯粹的粗略工作并且缺少单个小数可能使我们的测试无效。

我制作了一个快速原型,它使用一个简单的CSV文件,并使用Common.BeanUtils.populate(像梦一样工作)和一些强力解析将其调入输入和输出对象。我的文件看起来像这样:

Inputs | AtomicNumber | AtomicWeight | IsIsotope | RateOfDecay |
       | ###          | ###          | 1         | 0           |

Output | WillItBlend  |
       | 1            |

到目前为止这已经奏效了。我的问题是现在我来到一个有集合的类和一个看起来像这样的文件:

Inputs | MoleculeId | StateAtRoomTemp | IsPosionous | IsShiny |
       | ###        | L               | 1           | 1       |

Inputs | AtomicNumber | AtomicWeight | IsIsotope | RateOfDecay |
       | ###          | ###          | 1         | 0           |
       | ###          | ###          | 1         | 0           |
       | ###          | ###          | 1         | 0           |

Output | WillItBlend  |
       | 1            |

其中每个分子都有许多元素。有哪些(如果有的话)优雅的解决方案可以轻松制作出具有元素列表的分子bean?

2 个答案:

答案 0 :(得分:0)

我没有使用过Apache BeanUtils,所以我只是猜测......但我知道如果JAXB生成的JavaBeans必须使用列表,他们会创建一个List字段(或bean属性,在bean术语中)没有setter但是使用getter实例化该字段,如果它为null。像这样:

private List<?> elements;
public getElements() {
    if(elements == null)
        elements = new ArrayList<?>();
    return elements;
}

再一次,不确定这是否有任何帮助。

PS:这将是一个评论而不是一个答案,但我改变了它,因为评论不允许代码片段。

答案 1 :(得分:0)

我想出了一个可能但不完美的解决方案。我可以改变格式:

Inputs | AtomicNumber | AtomicWeight | IsIsotope | RateOfDecay |
       | ###          | ###          | 1         | 0           |
       | ###          | ###          | 1         | 0           |
       | ###          | ###          | 1         | 0           |

为:

*Elements | AtomicNumber | AtomicWeight | IsIsotope | RateOfDecay |
          | ###          | ###          | 1         | 0           |
          | ###          | ###          | 1         | 0           |
          | ###          | ###          | 1         | 0           |

当我点击*时,我使用PopulateUtils和后面的属性名来获取类型。然后我创建一个这种类型的新bean,像填充普通输入一样填充它,然后将新对象或对象集合放入先前创建的bean中。我并不为这个解决方案感到骄傲,所以我不会接受这一点,直到它明显变得更好。