2011-04-30 14 views
6

Estamos utilizando OpenCSV para analizar un archivo CSV y vincular sus valores directamente a un objeto de modelo (bean de entidad OpenJPA) utilizando la clase CsvToBean.OpenCSV parse de fecha

Sin embargo, el problema es - hay algunos valores en CSV que son (obviamente) analiza como Strings, sino que se establezcan en una propiedad Date, clase, así que básicamente CsvToBean muere al intentar invocar dinámicamente método de escritura (es decir, intenta establecer una propiedad de fecha con el valor de cadena sin procesar).

¿Hay alguna instalación dentro de OpenCSV que me permita especificar a qué tipo debe asignarse cada columna? Si no, ¿tiene alguna sugerencia qué clase extender/reimplementar para facilitar esto? La inspección de otras líneas disponibles en la distribución de fuente de OpenCSV bajo el directorio /test/au/com/bytecode/opencsv/bean/ no me permitió acercarme a la conclusión.

supongo que podría violín con el colocador Date propiedad y que sea un método genérico que obtener el tipo que se pasa como argumento, y tratar de analizar el valor pasado a Date si no es Date ya, pero ... estamos usando entidades con anotaciones de persistencia y no deseo ver más tarde que este "setter-hack" nos disparó porque a OpenJPA Enhancer no le gustaba el setter genérico.

He estado jugando con esto durante un par de horas - Probablemente podría haber resuelto el problema utilizando el reflejo y escribiendo mi propia lógica de enlazar frijoles, pero detestaba reinventar la rueda y tener una sensación/Espero que esto pueda hacerse de una manera fácil dentro del marco OpenCSV existente.

Si es necesario, podría publicar algún código, pero realmente no hay mucho que ver.

¿Alguna idea? Gracias.

Respuesta

3

¿Qué hay de la creación de una copia de la propiedad Fecha en su definición de clase? Hemos hecho algo similar utilizando BeanUtils

lo tanto, su clase de bean contiene

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 
} 
+0

Gracias a ambos: al combinar eficazmente sus sugerencias, pude hacerlo funcionar. Como la sugerencia de Kal está un poco más cerca de mi solución, acepté su solución, pero voté ambas respuestas. – quantum

1

Tal vez un método setter transitoria junto con el original iba a funcionar para usted:

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

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

Como alternativa, se puede usar Super CSV, que tiene una API cell processor lo que permitiría a leer el grano (sin modificaciones) usando el procesador ParseDate para esa columna.

+0

Sí, 'SuperCSV' es mucho mejor en este tipo de funcionalidad. – ngreen