7
votes

Pays de date OpenCsv

Nous utilisons OpenCsv pour analyser un fichier CSV et lier ses valeurs directement à un objet de modèle (OpenJPA Entity Bean) à l'aide de CSVTobean Classe.

Toutefois, le problème est - il existe certaines valeurs de CSV qui sont (évidemment) analysées sous forme , mais doivent être définies dans une propriété date , donc essentiellement csvtobean La classe décède en essayant d'invoquer dynamiquement la méthode d'écriture (c'est-à-dire qu'elle tente de définir une propriété de date avec une valeur de chaîne brute).

Y a-t-il une installation à l'intérieur de OpenCSV qui me permettrait de spécifier à quel type chaque colonne doit-elle être mappée? Sinon, avez-vous des suggestions quelle classe pour étendre / réimplement afin de faciliter cela? Inspection à d'autres stresses disponibles dans la distribution des sources OPENCSV sous / Test / AU / COM / BYTECODE / OPENCSV / Bean / N'a plus rapproché de conclusion.

Je suppose que je pourrait violez avec la date DATE Setter de propriété et faites-en une méthode générique qui permettrait d'émettre le type d'argument et d'essayer d'analyser la valeur transmise. dans date si ce n'est pas date déjà, mais ... Nous utilisons des entités annotées de persistance et je n'ai aucun souhait de voir plus tard sur ce "Setter- HACK "Tirez-nous dans notre pied parce que OpenJPA Améliorant a soudainement détesté le setter générique.

J'ai frappé ma tête autour de cela pendant quelques heures - j'aurais pu avoir probablement résolu le problème en utilisant la réflexion et en écrivant ma propre logique de liaison de haricots, mais je déteste réinventer la roue et j'ai un sentiment / J'espère que cela pourrait être fait un peu facilement dans le cadre opencsv existant.

Si nécessaire, je pourrais poster du code, mais il n'y a vraiment pas beaucoup à voir.

Toute pensée? Thx.


0 commentaires

3 Réponses :


1
votes

Peut-être une méthode de réglage transitoire à côté de l'original fonctionnerait pour vous:

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

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


0 commentaires

5
votes

Que diriez-vous de créer une copie de la propriété Date dans votre définition de classe? Nous avons fait quelque chose de similaire à l'aide de beansutils

de sorte que votre classe de haricots contient xxx


1 commentaires

Merci à vous deux - en combinant efficacement vos suggestions, j'ai pu le faire fonctionner. Comme la suggestion de Kal est un peu plus proche de ma solution, j'ai accepté sa solution, mais j'ai voté vos deux réponses.



2
votes

Alternativement, vous pouvez utiliser Super CSV , qui a un Processeur de cellule API qui vous permettrait de lire le haricot (sans modification) à l'aide du ParseDate processeur pour cette colonne.


1 commentaires

Oui, supercsv est beaucoup mieux à ce type de fonctionnalité.