NoSuchMethodException:java.time.LocalDateTime。<init>()使用超级CSV读取CSV

斯图尔特·莱兰·科尔

我已经LocalDateTime使用Super CSV 编写了一个仅包含到CSV文件的实体,使用ICsvDozerBeanWriter读回该文件时遇到错误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)

理想情况下,我想以yyyy-MM-dd格式将日期写入CSV文件,但一次只能执行一次!

詹姆斯·巴塞特

尽管Super CSV确实支持java.time.LocalDateTime通过其ParseLocalDateTimeFmtLocalDateTime单元处理器(super-csv-java8模块中均可用)进行读取和写入,但Dozer尝试实例化目标LocalDateTime对象而不是使用单元处理器的结果(Dozer已知问题-它不存在)支持Java 8时间)。

2个解决方法是...

使用CsvBeanReader

CsvDozerBeanReader交换CsvBeanReader您将失去对深度/索引映射的支持,但从好的方面来说,它会更快。

在DozerBeanMapper中配置Java 8支持

如关于Dozer问题的讨论,有一个dozer-jdk8-support库可以解决此问题。

添加依赖项:

<dependency>
  <groupId>io.craftsman</groupId>
  <artifactId>dozer-jdk8-support</artifactId>
  <version>1.0.2</version>
</dependency>

配置一个DozerBeanMapper

DozerBeanMapper beanMapper = new DozerBeanMapper();
beanMapper.setMappingFiles(Collections.singletonList("dozerJdk8Converters.xml"));

并将其提供给您CsvDozerBeanReader

new CsvDozerBeanReader(reader, CsvPreference.STANDARD_PREFERENCE, beanMapper)

这有点样板,但是如果您确实需要推土机支持,这将使您正常运行。

ps我已经创建了PR更新文档-仅列出了一个Java 8单元处理器,并且有堆!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

java.lang.NoSuchMethodException:package.ClassName。<init>()使用Class <?>

java.lang.NoSuchMethodException: <init> []

如何使用模式格式化java.time.LocalDateTime和java.time.LocalDate?

JFreeChart:使用 java.time.LocalDate 或 java.time.LocalDateTime 创建图表

最好的方法克隆java.time.LocalDateTime

使用GSON将java.time.LocalDateTime(java 8)序列化为js Date的最佳实践

使用ZoneId.systemDefault()将java.util.Date转换为java.time.LocalDateTime

Kotlin java.lang.NoSuchMethodException:<init>()

java.lang.NoSuchMethodException:AffirmativeBased。<init>()

如何在p:calendar中使用java.time.ZonedDateTime / LocalDateTime

如何使Spring Data Elasticsearch与java.time.LocalDateTime一起使用以获取日期

使用Locale格式化LocalDateTime实例时获取java.time.DateTimeException

转换java.sql.date到java.time.LocalDateTime

适用于java.time.LocalDateTime的DynamoDBMapper

LocalDateTime.parse处的java.time.format.DateTimeParseException

如何使用java.time.LocalDateTime将脚本中的日期和时间插入PostgreSQL数据库

使用Java 8解析LocalDateTime的问题

使用Java LocalDateTime解析Scala日期

使用Mybatis进行Java LocalDateTime转换

java.lang.NoSuchMethodException:userAuth.User。<init>()

Scala案例类中的init方法的java.lang.NoSuchMethodException

春季安全性Java NoSuchMethodException:SecurityConfig。<init>()

java.lang.ClassCastException: java.util.LinkedHashMap 不能转换为 java.time.LocalDateTime

转换LocalDateTime到LocalDateTime在Java特定区

Java从LocalDateTime Bar减去LocalDateTime foo

IllegalArgumentException:无法将java.time.LocalDateTime字段设置为java.sql.Timestamp

Java 8 java.time:在Instant vs LocalDateTime中添加TemporalUnit

在java.time.LocalDateTime和java.util.Date之间进行转换

如何获取即将到来的特定时间的java.time.LocalDateTime对象?