Сбой с InvalidFormatException при использовании полей даты с jackson-dataformat-csv - PullRequest
2 голосов
/ 23 мая 2019

Я пытаюсь использовать утилиту CSVMapper из jackson-dataformat-csv для анализа файла 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;
        }
    }

Это работало довольно долго, и я смог напечатать записи в цикле while, а затем вставил записи вMySQL таблица.

Не уверен, что изменилось в коде, теперь я попал в следующую проблему


com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not construct instance of java.sql.Date from String value ("20-MAY-19"): not a valid representation (error: Failed to parse Date value '20-MAY-19': Can not parse date "20-MAY-19": not compatible with any of standard forms ("yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd"))
 at [Source: com.fasterxml.jackson.dataformat.csv.impl.UTF8Reader@411358fc; line: 2, column: 147] (through reference chain: com.app.oracle.OMBugAnalyzerServices.entity.Bug["Reported"])
    at com.fasterxml.jackson.databind.exc.InvalidFormatException.from(InvalidFormatException.java:74) ~[jackson-databind-2.7.4.jar:2.7.4]
    at com.fasterxml.jackson.databind.DeserializationContext.weirdStringException(DeserializationContext.java:1021) ~[jackson-databind-2.7.4.jar:2.7.4]
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:788) ~[jackson-databind-2.7.4.jar:2.7.4]
    at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateBasedDeserializer._parseDate(DateDeserializers.java:175) ~[jackson-databind-2.7.4.jar:2.7.4]
    at com.fasterxml.jackson.databind.deser.std.DateDeserializers$SqlDateDeserializer.deserialize(DateDeserializers.java:284) ~[jackson-databind-2.7.4.jar:2.7.4]
    at com.fasterxml.jackson.databind.deser.std.DateDeserializers$SqlDateDeserializer.deserialize(DateDeserializers.java:269) ~[jackson-databind-2.7.4.jar:2.7.4]
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:490) ~[jackson-databind-2.7.4.jar:2.7.4]
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:95) ~[jackson-databind-2.7.4.jar:2.7.4]
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:260) ~[jackson-databind-2.7.4.jar:2.7.4]
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:125) ~[jackson-databind-2.7.4.jar:2.7.4]
    at com.fasterxml.jackson.databind.MappingIterator.nextValue(MappingIterator.java:277) ~[jackson-databind-2.7.4.jar:2.7.4]
    at com.fasterxml.jackson.databind.MappingIterator.next(MappingIterator.java:192) ~[jackson-databind-2.7.4.jar:2.7.4]
    at com.app.oracle.OMBugAnalyzerServices.controller.BugAnalyzerController.uploadMultipart(BugAnalyzerController.java:129) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_211]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_211]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_211]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_211]

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Вы можете установить шаблон формата в Джексоне, как показано ниже:

@JsonFormat(pattern="yy-MM-dd")
@JsonProperty("Reported")
private Date reportedDate;
0 голосов
/ 23 мая 2019

Как показано в приведенном ниже исключении,

com.fasterxml.jackson.databind.exc.InvalidFormatException: невозможно создать экземпляр java.sql.Date из значения String ("20-MAY-19"): недопустимое представление (ошибка: не удалось проанализировать значение даты '20 -MAY-19 ': невозможно проанализировать дату" 20-MAY-19 ": несовместимо ни с одной из стандартных форм (" гггг-ММ-дд "T'HH: мм: ss.SSSZ "," гггг-ММ-дд'Т'ХХ: мм: ss.SSS'Z '"," EEE, дд МММ гггг чч: мм: сс zzz "," гггг-ММ-dd "))

Возможно, вы изменили ниже.

@JsonProperty("Reported")
private Date reportedDate;
...