Java 将日期字段与jackson dataformat csv一起使用时,InvalidFormatException失败

Java 将日期字段与jackson dataformat csv一起使用时,InvalidFormatException失败,java,spring-boot,jackson-dataformat-csv,Java,Spring Boot,Jackson Dataformat Csv,我试图使用jackson dataformat csv中的CSVMapper实用程序来解析csv文件,并创建POJO记录以插入mysql数据库 这样做时,如果日期信息作为CSV中要映射到POJO中日期字段的列之一出现,我将面临问题 通过读取CSV文件并将其转换为POJO,我准备了以下代码 Bug.java @Entity @JsonIgnoreProperties(ignoreUnknown = true) public class Bug implements Serializable {

我试图使用jackson dataformat csv中的CSVMapper实用程序来解析csv文件,并创建POJO记录以插入mysql数据库

这样做时,如果日期信息作为CSV中要映射到POJO中日期字段的列之一出现,我将面临问题

通过读取CSV文件并将其转换为POJO,我准备了以下代码

Bug.java

@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
public class Bug implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;

    @JsonProperty
    @JsonFormat(shape = JsonFormat.Shape.NUMBER)
    private Long Num;

    @JsonProperty("Show Bug")
    private String URL;

    @JsonProperty
    private String Subject;

    @JsonProperty
    private String Customer;

    @JsonProperty
    private String Tags;

    @JsonProperty
    private String St;

    @JsonProperty("Rep. Release")
    private String ReportedRelease;

    @JsonProperty("Reported")
    private Date reportedDate;

    @JsonProperty
    private String Sev;

    @JsonProperty
    private String Assignee;

    @JsonProperty
    private String Component;

    public Bug() {}

        /* getters and setters */
控制器代码


@PostMapping(value = "/upload", consumes = "multipart/form-data")
    public void uploadMultipart(@RequestParam("file") MultipartFile file) throws IOException {

try {

            CsvSchema bootstrap = CsvSchema.builder().setUseHeader(true)
                        .addColumn("Sl No.", CsvSchema.ColumnType.NUMBER)
                        .addColumn("Num", CsvSchema.ColumnType.NUMBER)
                        .addColumn("Show Bug", CsvSchema.ColumnType.STRING)
                        .addColumn("Customer", CsvSchema.ColumnType.STRING)
                        .addColumn("Rep. Release", CsvSchema.ColumnType.STRING)
                        .addColumn("Reported")
                        .addColumn("Component", CsvSchema.ColumnType.STRING)
                        .addColumn("Assignee", CsvSchema.ColumnType.STRING)
                        .addColumn("Sev", CsvSchema.ColumnType.STRING)
                        .addColumn("St", CsvSchema.ColumnType.STRING)
                        .addColumn("Tags", CsvSchema.ColumnType.STRING)
                        .addColumn("Subject", CsvSchema.ColumnType.STRING)
                        .build().withHeader();

            CsvMapper csvMapper = new CsvMapper();

            MappingIterator<Bug> bugInfo = 
                    csvMapper.readerFor(Bug.class).with(bootstrap).readValues(file.getInputStream());

            System.out.println("************************ Bug Information ************************");

            while(bugInfo.hasNext()) {
                Bug bugRec = bugInfo.next();
                System.out.println("Customer : " + bugRec.getCustomer());
                System.out.println("URL : " + bugRec.getURL());
            }


} catch(IOException exception) {
            throw exception;
        }
    }


正如下面的例外所说

com.fasterxml.jackson.databind.exc.InvalidFormatException:无法 从字符串值(“19年5月20日”)构造java.sql.Date的实例: 不是有效的表示形式(错误:无法分析日期值 “19年5月20日”:无法分析日期“19年5月20日”:与任何 标准格式(“yyyy-MM-dd'T'HH:MM:ss.SSSZ”, “yyyy-MM-dd'T'HH:MM:ss.SSS'Z'”,“EEE,dd-MM-yyyy-HH:MM:ss-zzz”, “yyyy-MM-dd”))

也许,你改变了下面的内容

@JsonProperty("Reported")
private Date reportedDate;

您可以在jackson中设置格式模式,如下所示:

@JsonFormat(pattern="yy-MM-dd")
@JsonProperty("Reported")
private Date reportedDate;

嗨,桑比特。谢谢你的及时回复。我在早些时候也遇到了同样的问题。此时,reportedDate字段数据类型指向java.util.date。当它不工作时,我将它改为java.sql.Date,它开始工作。但是,目前我看到java.util.Date和java.sql.Date.Hi Sambit都有例外,我无法将类型更改为String。它是数据库上的一个日期字段。唯一的选项是将日期转换为所需格式(mm dd yyyy)的字符串,如下图所示。csv映射器是否无法处理日期数据类型?因为,如果日期字段映射到数据库中的基础列,并且我无法更改其类型。而且,它在早些时候确实起了作用,这让我相信代码中的某些内容已经发生了变化,因为它现在不起作用了。就在3小时前,我插入了500多条记录。现在有些东西改变了,我没有backup.CSV文件,主要是数字、字符串。如何解释它,日期取决于我们。CSV与excel不同。非常感谢。你的推荐成功了!但我仍然想知道,当我之前从未在POJO类上添加过此注释时,它是如何工作的。如果没有这个,它还能工作吗?这只是为了我的学习目的,因为我确信我之前没有添加此注释。@svijay.aug12不客气。可能使用之前的日期是支持的格式。或者有一个杰克逊定制之前存在。支持的格式是“yyyy-MM-dd'T'HH:MM:ss.SSSZ”,“yyyy-MM-dd'HH:MM:ss.SSS'Z'”,“EEE,dd-MM-yyyy-HH:MM:ss-zzz”,“yyyy-MM-dd”,如异常堆栈跟踪中所述
@JsonFormat(pattern="yy-MM-dd")
@JsonProperty("Reported")
private Date reportedDate;