我们使用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。
答案 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(无需修改)。