7

我们正在使用 OpenCSV 解析 CSV 文件,并通过使用CsvToBeanclass 将其值直接绑定到模型对象(OpenJPA 实体 bean)。

但是,问题是 - CSV 中有一些值(显然)被解析为Strings,但应该在Date属性中设置,所以基本上 CsvToBean 类在尝试动态调用写入方法时死掉(即,它尝试设置 Date 属性带有原始字符串值)。

OpenCSV 中是否有任何工具可以让我指定每列应该映射到哪种类型?如果没有,您有什么建议要扩展/重新实现什么类以促进这一点?检查目录下 OpenCSV 源代码分发中的其他可用策略/test/au/com/bytecode/opencsv/bean/让我无法得出结论。

我想我可以摆弄Date属性设置器并使其成为一个通用方法,它将类型作为参数传递,并尝试将传递的值解析为Date如果它还没有Date,但是....我们正在使用持久性带注释的实体,我不希望以后看到这个“setter-hack”让我们大吃一惊,因为 OpenJPA Enhancer 突然不喜欢泛型 setter。

我已经为此苦恼了几个小时——我本可以通过使用反射和编写自己的 bean 绑定逻辑来解决这个问题,但我讨厌重新发明轮子并有一种感觉/希望这可以可以在现有的 OpenCSV 框架内轻松完成。

如果需要,我可以发布一些代码,但真的没什么可看的。

有什么想法吗?谢谢。

4

3 回答 3

5

在你的类定义中创建一个 Date 属性的副本怎么样?我们使用 BeanUtils 做了类似的事情

因此,您的 Bean 类包含

String dateString;
Date date;

public void setDateString(String dateString) {
     // This method can parse the dateString and set date object as well
}

public void setDate(Date date) {
     // Use this for JPA
}
于 2011-04-30T16:03:53.717 回答
2

或者,您可以使用Super CSV,它有一个单元处理器API,允许您使用该列的ParseDate处理器读取 bean(无需修改)。

于 2012-12-12T21:59:25.000 回答
1

也许与原始方法一起使用的瞬态 setter 方法对您有用:

@Transient
public void setDate(String date) {
   Date d = parseDate(date);
   setDate(d);
}

@Column
public void setDate(Date date) {
  this.date = date;
}
于 2011-04-30T15:59:20.057 回答