当使用`CsvDozerBeanWriter`时,如何告诉SuperCSV映射空的`String`属性?

时间:2012-12-26 05:44:18

标签: java csv dozer supercsv

我正在使用CsvDozerBeanWriter将bean实例写入CSV文件。在example代码之后,我在将bean写入CSV之前使用了CsvDozerBeanWriter#configureBeanMapping(...)。一切都很好,除非bean的String属性为空(而不是null)。我发现在写入之前,这些属性不会从bean复制到中间CsvDozerBeanData实例。这会导致异常,因为列数与单元处理器的数量不匹配。

挖掘我发现configureBeanMapping(...)相当于将Dozer的map-empty-string设置为False。因此,未映射所有字符串(null字符串仍会被映射)。

我如何克服这个问题?提供我自己的DozerBeanMapper(正如documentation所说)最好的方法吗?

更新

以下是我获得的例外的详细信息:

 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个属性al。属性hl是空字符串。

更新2:

这是test case

1 个答案:

答案 0 :(得分:1)

如果map-empty-string被禁用,则传递给单元处理器的值应为null(即,您很可能从该列的处理器收到错误,指出该值不应该是null - 关于处理器数量错误的例外情况。如果您可以发布异常详细信息以澄清这将是很好的:)

使用CsvDozerBeanWriter运行一些测试后,看起来Dozer 5.4.0中的Dozer映射API已得到修复(参见this commit)。

  • 在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的自己的Writer(但覆盖configureBeanMapping()方法以提供MappingBuilder启用map-empty-string

  • 使用CsvBeanWriter(如果您没有使用索引/深度映射)

仅供参考我在5.3.2中遇到了映射API的另一个错误,这意味着我必须在编写map-null时在类级而不是映射级别启用CsvDozerBeanWriter - 这也已修复5.4.0(虽然Super CSV可以在任何版本的Dozer中正常运行。)