OpenCSV日期解析

时间:2011-04-30 15:55:03

标签: java opencsv

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

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

OpenCSV中是否有任何工具允许我指定每列应映射到哪种类型?如果没有,你有什么建议可以扩展/重新实现以便于此吗?在/test/au/com/bytecode/opencsv/bean/目录下检查OpenCSV源代码分发中的其他可用strageties让我无法接近结论。

我猜我可以摆弄Date属性setter,并使其成为一个泛型方法,将该类型作为参数传递,并尝试将传递的值解析为{{ 1}}如果它已经不是Date,但是....我们正在使用持久性注释的实体,我不希望稍后看到这个“setter-hack”用我们的脚射击我们因为OpenJPA Enhancer突然不喜欢通用的二传手。

我一直在抨击这个问题几个小时 - 我可能已经通过使用反射和编写我自己的bean绑定逻辑解决了这个问题,但是我不喜欢重新发明轮子并且有一种感觉/希望这可以在现有的OpenCSV框架内轻松完成。

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

有什么想法? THX。

3 个答案:

答案 0 :(得分:4)

如何在类定义中创建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
}

答案 1 :(得分:1)

也许一个瞬态的setter方法与原始方法一起适合你:

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

@Column
public void setDate(Date date) {
  this.date = date;
}

答案 2 :(得分:1)

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