【问题标题】:OpenCSV date parseOpenCSV 日期解析
【发布时间】:2011-04-30 15:55:03
【问题描述】:

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

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

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

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

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

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

有什么想法吗?谢谢。

【问题讨论】:

    标签: java opencsv


    【解决方案1】:

    在你的类定义中创建一个 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
    }
    

    【讨论】:

    • 谢谢你们 - 通过有效地结合你们的建议,我能够让它发挥作用。由于 Kal 的建议更接近我的解决方案,我接受了他的解决方案,但我对你的两个答案都投了赞成票。
    【解决方案2】:

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

    【讨论】:

    • 是的,SuperCSV 在这种功能方面要好得多。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-04
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多