我正在使用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
个属性a
到l
。属性h
到l
是空字符串。
这是test case。
答案 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中正常运行。)