2017-07-30 8 views
0

私は、opencsvアノテーションを使用して読み書き可能なcsvファイルにopencsvを使用しています。 私のbeanはプリミティブだけでなく、JavaのHashMapも持っています。 は今、私は何をしたい、私は両方で、この作業は、読み取り/書き込み取得したいのですが型hashMapのフィールドを書き込むためのMappingStragety

public class MyBean { 

    @CsvBindByName(column = "ID") 
    private int id; 

    @CsvBindByName(column = "PROPERTIES") 
    private Map<String, String> sampleMap = new HashMap<String, String>(); 

ID, property1, property2... 
1, value1, value2..... 

することです。

この場合、デフォルトのMappingStrategyは機能しません。カスタムMappingStrategyを作成してもHashMapフィールドには意味がありません。すべてのマップを反復するまでは完全なフィールドリストがわからないからです。

カラム名を取得する別の方法は、Beanのリストから1つのBeanを読み込むことです。そして、HashMapにアクセスしてヘッダを作成してください(ハッシュマップキーは私のケースではBean全体に固定されています)。

MappingStrategyはクラスレベルのメタデータにのみ関心があります。フィールドなどのように

public static Field[] getAllFields(Class<?> cls) { 
     List allFieldsList = getAllFieldsList(cls); 
     return (Field[])allFieldsList.toArray(new Field[allFieldsList.size()]); 
    } 

は、CSVヘッダーを作成するための実際のデータへのアクセスを得ることは行うには自然な方法のようには見えません。

これを解決する方法についてのアドバイスはありますか?

Mapフィールドを持つ豆に読み書きすることができる他のライブラリに私を指摘してください。

乾杯!

+0

正確には、まだCSVファイルがありません。だから、執筆は私の最初の一歩です。 Map > ..あなたは、そのMapに何が含まれているかを詳しく説明できますか? – brownfox

答えて

0

悲しいことにopenCSVはこれをサポートしていません。速いgoogleは私に、SuperCSVが近づくのを見せましたが、マップに何が入っているのか、何がないのかをコントロールしたいのですが、すべてをマップに入れました。そこに他の人がいるかもしれませんが、ほとんどの場合、オブジェクトのフィールドとcsvファイルの列の間に1対1が必要です。

これは何年もの間開発したいと思っていましたが、私が現在働いている会社はそれを必要としていますが、私はそれを開発するために払いたくありません。 。

データ転送オブジェクトと呼ばれるものを作成することができますが、回避策は限られています。必要なすべての値を持つカスタムオブジェクトを持ち、必要な型のオブジェクトを返します(または、すべてのフィールドを持つDTOをマップといくつかのフィールドで必要なオブジェクトに変換するトランスレータ)。このソリューションの問題点は、マップにある可能性のあるすべてのエントリを事前に知ることです。

関連する問題