1

CsvDozerBeanWriterBean インスタンスを CSV ファイルに書き込むために使用しています。Bean を CSV に書き込む前に使用したコード例に従います。Bean の属性が ( ではなく) 空CsvDozerBeanWriter#configureBeanMapping(...)の場合を除いて、すべてが正常に機能します。そのような属性は、書き込み前に Bean から中間インスタンスにコピーされないことがわかりました。これにより、列の数がセル プロセッサの数と一致しないため、例外が発生します。StringnullCsvDozerBeanData

configureBeanMapping(...)掘り下げてみると、 Dozer を に設定するのと同じことを実行することがわかりましmap-empty-stringFalseしたがって、空の文字列はすべてマップされません (null文字列は引き続きマップされます)。

どうすればこれを克服できますか?DozerBeanMapper(ドキュメントにあるように)自分で提供するのが最善の方法ですか?

アップデート:

私が得た例外の詳細は次のとおりです。

 org.supercsv.exception.SuperCsvException: The number of columns to be processed (7) must match the number of CellProcessors (12): check that the number of CellProcessors you have defined matches the expected number of columns being read/written
context={lineNo=2, rowNo=2, columnNo=1, rowSource=[a, b, c, d, e, f, g]}
org.supercsv.exception.SuperCsvException: The number of columns to be processed (7) must match the number of CellProcessors (12): check that the number of CellProcessors you have defined matches the expected number of columns being read/written
context={lineNo=2, rowNo=2, columnNo=1, rowSource=[a, b, c, d, e, f, g]}
    at org.supercsv.util.Util.executeCellProcessors(Util.java:78)
    at org.supercsv.io.dozer.CsvDozerBeanWriter.write(CsvDozerBeanWriter.java:133)

Bean には から までの属性Stringがあります。~の属性は空の文字列です。alhl

更新 2:

ここにテストケースがあります。

4

1 に答える 1

1

が無効になっている場合map-empty-string、セル プロセッサに渡される値は次のようになりますnull(つまり、その列のプロセッサから値が null であってはならないというエラーが表示される可能性が高くなります。プロセッサの数が間違っているという例外ではありません)。 )。これを明確にするために例外の詳細を投稿できれば、それは素晴らしいことです:)

でいくつかのテストを実行した後CsvDozerBeanWriter、Dozer マッピング API は Dozer 5.4.0 で修正されたようです (このコミットを参照)。

  • Dozer では 5.3.2""がマッピングされていますnull

  • Dozer では 5.4.0""がマッピングされています""

残念ながら、Dozer 5.4.0 の詳細なリリース ノートはありません (GitHub で作成された問題はありません。まだ SourceForge から移行中です)。

Dozer 5.4.0 にアップグレードできれば、問題は解決するはずです。次のリリース (来年初め) で Super CSV を Dozer 5.4.0 にアップグレードする予定ですが、今のところ Super CSV から継承されたバージョンをオーバーライドすることを妨げるものは何もありません。

何らかの理由で Dozer 5.3.2 に行き詰まっている場合は、次のいずれかをお勧めします。

  • 拡張する独自のライターを作成します(ただし、メソッドをCsvDozerBeanWriterオーバーライドして、有効になっているを提供します)configureBeanMapping()MappingBuildermap-empty-string

  • 使用CsvBeanWriter(インデックス付き/ディープ マッピングを使用していない場合)

参考までに、5.3.2 のマッピング API で別のバグに遭遇しました。これはmap-null、書き込み時にマッピング レベルではなくクラス レベルで有効にする必要があることを意味していました。CsvDozerBeanWriterこれも 5.4.0 で修正されています (ただし、Super CSV はどちらのバージョンでも正しく機能します)。ドーザーの)。

于 2012-12-26T10:32:35.180 に答える