Stu*_*ole 6 java csv dozer java-8 supercsv
我编写了一个实体,其中只包含一个LocalDateTime使用Super CSV的 CSV文件,ICsvDozerBeanWriter并且在使用a读取它时遇到错误ICsvDozerBeanReader.我能够成功读取和写入一个Date对象,但LocalDateTime无法正常工作.
我添加了super-csv-java8依赖项,写入部分似乎工作正常.
我在这个Github仓库中创建了一个小型演示应用程序来复制问题.运行main()方法,错误将输出到控制台.
这是我得到的例外:
2016-12-09 22:24:02.427 ERROR 50405 --- [ main] org.dozer.MappingProcessor : Field mapping error -->
MapId: null
Type: null
Source parent class: org.supercsv.io.dozer.CsvDozerBeanData
Source field name: columns
Source field type: class java.time.LocalDateTime
Source field value: 2016-12-09T22:24:02.226
Dest parent class: com.example.Entity
Dest field name: dateTime
Dest field type: java.time.LocalDateTime
org.dozer.MappingException: java.lang.NoSuchMethodException: java.time.LocalDateTime.<init>()
at org.dozer.util.MappingUtils.throwMappingException(MappingUtils.java:82) ~[dozer-5.4.0.jar:na]
at org.dozer.factory.ConstructionStrategies$ByConstructor.newInstance(ConstructionStrategies.java:261) ~[dozer-5.4.0.jar:na]
at org.dozer.factory.ConstructionStrategies$ByConstructor.create(ConstructionStrategies.java:245) ~[dozer-5.4.0.jar:na]
at org.dozer.factory.DestBeanCreator.create(DestBeanCreator.java:65) ~[dozer-5.4.0.jar:na]
at org.dozer.MappingProcessor.mapCustomObject(MappingProcessor.java:489) [dozer-5.4.0.jar:na]
at org.dozer.MappingProcessor.mapOrRecurseObject(MappingProcessor.java:446) [dozer-5.4.0.jar:na]
at org.dozer.MappingProcessor.mapFromFieldMap(MappingProcessor.java:342) [dozer-5.4.0.jar:na]
at org.dozer.MappingProcessor.mapField(MappingProcessor.java:288) [dozer-5.4.0.jar:na]
at org.dozer.MappingProcessor.map(MappingProcessor.java:248) [dozer-5.4.0.jar:na]
at org.dozer.MappingProcessor.map(MappingProcessor.java:197) [dozer-5.4.0.jar:na]
at org.dozer.MappingProcessor.map(MappingProcessor.java:187) [dozer-5.4.0.jar:na]
at org.dozer.MappingProcessor.map(MappingProcessor.java:124) [dozer-5.4.0.jar:na]
at org.dozer.MappingProcessor.map(MappingProcessor.java:119) [dozer-5.4.0.jar:na]
at org.dozer.DozerBeanMapper.map(DozerBeanMapper.java:120) [dozer-5.4.0.jar:na]
at org.supercsv.io.dozer.CsvDozerBeanReader.readIntoBean(CsvDozerBeanReader.java:220) [super-csv-dozer-2.4.0.jar:na]
at org.supercsv.io.dozer.CsvDozerBeanReader.read(CsvDozerBeanReader.java:160) [super-csv-dozer-2.4.0.jar:na]
at com.example.DemoApplication.readEntities(DemoApplication.java:51) [classes/:na]
at com.example.DemoApplication.main(DemoApplication.java:39) [classes/:na]
Caused by: java.lang.NoSuchMethodException: java.time.LocalDateTime.<init>()
at java.lang.Class.getConstructor0(Class.java:3082) ~[na:1.8.0_66]
at java.lang.Class.getDeclaredConstructor(Class.java:2178) ~[na:1.8.0_66]
at org.dozer.factory.ConstructionStrategies$ByConstructor.newInstance(ConstructionStrategies.java:257) ~[dozer-5.4.0.jar:na]
... 16 common frames omitted
org.dozer.MappingException: java.lang.NoSuchMethodException: java.time.LocalDateTime.<init>()
at org.dozer.util.MappingUtils.throwMappingException(MappingUtils.java:82)
at org.dozer.factory.ConstructionStrategies$ByConstructor.newInstance(ConstructionStrategies.java:261)
at org.dozer.factory.ConstructionStrategies$ByConstructor.create(ConstructionStrategies.java:245)
at org.dozer.factory.DestBeanCreator.create(DestBeanCreator.java:65)
at org.dozer.MappingProcessor.mapCustomObject(MappingProcessor.java:489)
at org.dozer.MappingProcessor.mapOrRecurseObject(MappingProcessor.java:446)
at org.dozer.MappingProcessor.mapFromFieldMap(MappingProcessor.java:342)
at org.dozer.MappingProcessor.mapField(MappingProcessor.java:288)
at org.dozer.MappingProcessor.map(MappingProcessor.java:248)
at org.dozer.MappingProcessor.map(MappingProcessor.java:197)
at org.dozer.MappingProcessor.map(MappingProcessor.java:187)
at org.dozer.MappingProcessor.map(MappingProcessor.java:124)
at org.dozer.MappingProcessor.map(MappingProcessor.java:119)
at org.dozer.DozerBeanMapper.map(DozerBeanMapper.java:120)
at org.supercsv.io.dozer.CsvDozerBeanReader.readIntoBean(CsvDozerBeanReader.java:220)
at org.supercsv.io.dozer.CsvDozerBeanReader.read(CsvDozerBeanReader.java:160)
at com.example.DemoApplication.readEntities(DemoApplication.java:51)
at com.example.DemoApplication.main(DemoApplication.java:39)
Caused by: java.lang.NoSuchMethodException: java.time.LocalDateTime.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.getDeclaredConstructor(Class.java:2178)
at org.dozer.factory.ConstructionStrategies$ByConstructor.newInstance(ConstructionStrategies.java:257)
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想以yyyy-MM-dd格式将日期写入CSV文件,但一步一步!
虽然Super CSV 确实支持java.time.LocalDateTime通过它ParseLocalDateTime和FmtLocalDateTime单元处理器(都在super-csv-java8模块中提供)进行读写,但是Dozer试图实例化目标LocalDateTime对象而不是使用单元处理器的结果(这是Dozer 的一个已知问题 - 它不是支持Java 8时间).
这2个解决方法是......
SWAP CsvDozerBeanReader出与CsvBeanReader.您将失去深度/索引映射支持,但从好的方面来说,它会快得多.
正如Dozer问题所讨论的那样,有一个dozer-jdk8支持库可以解决这个问题.
添加依赖项:
<dependency>
<groupId>io.craftsman</groupId>
<artifactId>dozer-jdk8-support</artifactId>
<version>1.0.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
配置一个DozerBeanMapper:
DozerBeanMapper beanMapper = new DozerBeanMapper();
beanMapper.setMappingFiles(Collections.singletonList("dozerJdk8Converters.xml"));
Run Code Online (Sandbox Code Playgroud)
并提供给您CsvDozerBeanReader:
new CsvDozerBeanReader(reader, CsvPreference.STANDARD_PREFERENCE, beanMapper)
Run Code Online (Sandbox Code Playgroud)
这是一个样板,但如果你真的需要Dozer支持,这将让你开始运行.
ps我已经创建了一个PR以更新文档 - 只列出了一个Java 8单元处理器,并且有堆!