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

标签 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

最佳答案

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

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

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

  • 编写自己的 Writer 来扩展 CsvDozerBeanWriter(但重写 configureBeanMapping() 方法以提供启用了 map-empty-stringMappingBuilder)

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

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

关于java - 使用 `String` 时,如何告诉 SuperCSV 映射空的 `CsvDozerBeanWriter` 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14036441/

相关文章:

java - 将列表映射到 Dozer 中的列表

java - Tomcat Alpha SSL 配置

java - 数据库或 CSV 到 java 对象

Python:将 CSV 数据存储在列表或数组中

java - 如何解析不规则使用引号的 CSV 文件?

java - 推土机的多态性

spring - 推土机和 Spring 集成

Java:Android:SQLite:使用 For 循环执行多次插入

java - 并发变量修改 : cannot fully understand this example

java - 物理命名策略已注册但在持久性时未触发