Разбор дат OpenCSV - PullRequest
       3

Разбор дат OpenCSV

6 голосов
/ 30 апреля 2011

Мы используем OpenCSV для анализа файла CSV и привязки его значений непосредственно к объекту модели (объектному компоненту OpenJPA) с использованием CsvToBean класса.

Однако проблема в том, что в CSV есть некоторые значения, которые (очевидно) анализируются как Strings, но должны быть установлены в свойстве Date, поэтому в основном класс CsvToBean умирает при попытке динамически вызвать метод записи ( т.е. он пытается установить свойство Date с необработанным значением String).

Есть ли какое-либо средство внутри OpenCSV, которое позволило бы мне указать, какому типу должен быть сопоставлен каждый столбец? Если нет, есть ли у вас какие-либо предложения, какой класс расширить / переопределить, чтобы облегчить это? Изучение других доступных особенностей в дистрибутиве исходного кода OpenCSV в каталоге /test/au/com/bytecode/opencsv/bean/ не привело меня к выводу.

Полагаю, я мог бы поиграться с установщиком свойства Date и сделать его универсальным методом, который бы получал тип, передаваемый в качестве аргумента, и попытаться проанализировать переданное значение в Date, если оно еще не Date, но ... мы используем сущности, аннотированные постоянством, и я не хочу видеть позже, что этот "хакерский сеттер" ударил нас в ногу, потому что OpenJPA Enhancer внезапно не понравился универсальный сеттер.

Я несколько часов ломал голову над этим - возможно, я мог бы решить эту проблему, используя рефлексию и написав свою собственную логику привязки бина, но я ненавижу заново изобретать колесо и у меня возникает чувство / надеюсь, что это можно сделать довольно легко внутри существующей платформы OpenCSV.

При необходимости, я мог бы опубликовать некоторый код, но на самом деле не так много, чтобы увидеть.

Есть мысли? Thx.

Ответы [ 3 ]

4 голосов
/ 30 апреля 2011

Как насчет создания копии свойства 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 голос
/ 13 декабря 2012

В качестве альтернативы, вы можете использовать Super CSV , который имеет процессор ячейки API, который позволит вам читать бин (без изменений), используя ParseDate процессор для этого столбца.

1 голос
/ 30 апреля 2011

Возможно, метод переходного сеттера наряду с оригиналом подойдет вам:

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

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