1

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

深入研究我发现这configureBeanMapping(...)相当于将推土机的设置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)

beanString具有a通过l. h通过的属性l是空字符串。

更新 2:

这是一个测试用例

4

1 回答 1

1

如果map-empty-string被禁用,则传递给单元处理器的值应该是null(即,您很可能会从该列的处理器中收到一个错误,说明该值不应为空 - 不是处理器数量错误的例外)。如果您可以发布异常详细信息以澄清这一点,那就太好了:)

在使用 运行一些测试之后CsvDozerBeanWriter,看起来 Dozer 映射 API 已在 Dozer 5.4.0 中修复(请参阅提交)。

  • 在推土机 5.3.2""中映射到null

  • 在推土机 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 上,那么我建议您:

  • 编写您自己的 Writer 扩展CsvDozerBeanWriter(但覆盖configureBeanMapping()提供MappingBuildermap-empty-string启用的方法)

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

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

于 2012-12-26T10:32:35.180 回答