OpenCSV未映射带注释的JavaBean

OpenCSV未映射带注释的JavaBean,java,csv,annotations,javabeans,opencsv,Java,Csv,Annotations,Javabeans,Opencsv,我正在使用OpenCSV库的3.8版。我正在使用注释将bean字段映射到CSV文件中的列。我认为它在一定程度上起作用了。当日期字段为空时,它将失败 java.lang.RuntimeException: Error parsing CSV line: 1 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMetho

我正在使用OpenCSV库的3.8版。我正在使用注释将bean字段映射到CSV文件中的列。我认为它在一定程度上起作用了。当日期字段为空时,它将失败

java.lang.RuntimeException: Error parsing CSV line: 1 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

 **Caused by: com.opencsv.exceptions.CsvDataTypeMismatchException**
at com.opencsv.bean.BeanFieldDate.convertLocaleInspecific(BeanFieldDate.java:216)
at com.opencsv.bean.BeanFieldDate.convert(BeanFieldDate.java:242)
at com.opencsv.bean.AbstractBeanField.setFieldValue(AbstractBeanField.java:70)
at com.opencsv.bean.CsvToBean.processField(CsvToBean.java:245)
at com.opencsv.bean.CsvToBean.processLine(CsvToBean.java:220)
at com.opencsv.bean.CsvToBean.processLine(CsvToBean.java:189)
at com.opencsv.bean.CsvToBean.parse(CsvToBean.java:166)
... 26 more
**Caused by: org.apache.commons.beanutils.ConversionException: No value specified for 'Date'
at** org.apache.commons.beanutils.converters.AbstractConverter.handleMissing(AbstractConverter.java:327)
at org.apache.commons.beanutils.converters.DateTimeConverter.convertToType(DateTimeConverter.java:327)
at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:169)
at com.opencsv.bean.BeanFieldDate.convertLocaleInspecific(BeanFieldDate.java:214)
... 32 more
特定bean字段的注释为“required=false”,但仍然不起作用。下面是我使用Java.Util.Date类的JavaBean注释:

@CsvBindByName(column="Sent On", required=true)
@CsvDate(value="MM/dd/yyyy HH:mm:ss a z")
private Date sentOn;

@CsvBindByName(column="Last Activity", required=false)
@CsvDate(value="MM/dd/yyyy HH:mm:ss a z")
private Date lastActivity;

@CsvBindByName(column="Completed On", required=false)
@CsvDate(value="MM/dd/yyyy HH:mm:ss a z")
private Date completedOn; 
这就是我创建CSV阅读器和解析器的方式:

    final char QUOTE_CHARACTER = '"';
    ClassLoader classLoader = getClass().getClassLoader();
    File newFile = new File(classLoader.getResource(fileName).getFile());
    CSVReader reader2 = null;

    FileReader fileReader2 = null;

    List<My_Data> myList = null;

     try {

        HeaderColumnNameMappingStrategy<My_Data> strat = new HeaderColumnNameMappingStrategy<My_Data>();
        strat.setType(My_Data.class);

        CsvToBean<My_Data> csv = new CsvToBean<>();

        final CSVParser csvParser = new CSVParserBuilder().withSeparator(delimiter)
                                                          .withQuoteChar(QUOTE_CHARACTER)
                                                          .withStrictQuotes(true)
                                                          .build();

        fileReader2 = new FileReader(newFile);

        reader2 = new CSVReaderBuilder(fileReader2).withCSVParser(csvParser)
                                                   .withVerifyReader(true)
                                                   .withKeepCarriageReturn(false)
                                                   .build();


         myList = csv.parse(strat, reader2);
我是如何发现这一错误的,这是在浏览源代码。我希望其他人也面临类似的问题,并能给我一个如何回避这个问题的建议。我喜欢这种映射方法,因为它节省了我的时间和精力。该过程通过将文件读入列表来工作。这种方法的问题是我必须为JavaBeans编写工厂流程

欢迎提出建议

谢谢


Russ

我们将您看到的问题确定为opencsv代码中的问题。一位贡献者正在重写3.9版本中的日期处理代码,因此我们将确保该代码修复您的问题

我们尚未为3.9版本设置日期,因此,如果您需要立即执行某些操作,并且您已经或可以自己构建代码,请转到BeanFieldDate类并在convert方法中替换:

    if (required && StringUtils.isEmpty(value)) {
        throw new CsvRequiredFieldEmptyException();
    }
有点像

    if (required && StringUtils.isEmpty(value)) {
        if (required) {
            throw new CsvRequiredFieldEmptyException();
        } else {
            return null;   // or maybe empty string
        }
    }

看看这是否有帮助。

我们在opencsv代码中将您看到的问题确定为一个问题。一位贡献者正在重写3.9版本中的日期处理代码,因此我们将确保该代码修复您的问题

我们尚未为3.9版本设置日期,因此,如果您需要立即执行某些操作,并且您已经或可以自己构建代码,请转到BeanFieldDate类并在convert方法中替换:

    if (required && StringUtils.isEmpty(value)) {
        throw new CsvRequiredFieldEmptyException();
    }
有点像

    if (required && StringUtils.isEmpty(value)) {
        if (required) {
            throw new CsvRequiredFieldEmptyException();
        } else {
            return null;   // or maybe empty string
        }
    }

看看这是否会有帮助。

如中所示失败,是一个例外吗?或者由于未按预期工作而失败。是否忽略了标题?第1行似乎有误,即校长感谢你的建议。当我跳过第一行时,映射程序无法找到基于列的bean字段。所发生的是创建了JavaBean,但没有填充任何字段。我发现AbstractConverter类在尝试转换为java.util.Date时没有正确处理“”字符串。useDefault变量设置为false。默认值等于null。handleMissing方法正在引发一个ConversionException。在中失败,是否引发异常?或者由于未按预期工作而失败。是否忽略了标题?第1行似乎有误,即校长感谢你的建议。当我跳过第一行时,映射程序无法找到基于列的bean字段。所发生的是创建了JavaBean,但没有填充任何字段。我发现AbstractConverter类在尝试转换为java.util.Date时没有正确处理“”字符串。useDefault变量设置为false。默认值等于null。handleMissing方法正在抛出ConversionException。Scott,感谢您的建议。我下载了源代码并尝试了两者。它不起作用-(出于同样的原因,它仍在同一数据点上失败。Scott,感谢您的建议。我下载了源代码并尝试了这两种方法。它不起作用。:-(出于同样的原因,它仍在同一数据点上失败。)。