Проблема OpenCSV с использованием HeaderColumnNameTranslateMappingStrategy с внешними ключами - PullRequest
1 голос
/ 16 января 2020

Я использую OpenCSV 5.0 для анализа моего csv с HeaderColumnNameTranslateMappingStrategy. Это работает хорошо, и у меня не было проблем с использованием примитивных типов данных, таких как String, int, boolean et c.

, потому что кто-то просил об этом. file является частью requestParams метода.

@RequestParam("file") MultipartFile file

Но теперь у меня есть атрибут, который является объектом другого класса.

@JoinColumn(name = "article$ean", referencedColumnName = "ean")
@OneToOne(cascade = CascadeType.ALL)
private Article article$ean;

Когда CsvToBean анализирует элементы, выдает ошибку для каждого элемента:

Konvertierung von 010000 in de.iis.databaseHub.entity.Article fehlgeschlagen.

Переведено на английский sh:

Conversion from 010000 to de.iis.databaseHub.entity.Article failed. 

Моя сущность (сокращенная) выглядит так:

@Entity
@Data //lombok annotation
public class Transaction implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long transactionId;

    @Size(max = 30)
    private String timestamp;

    private int receiptNo;

    private int receiptPosNo; // (e.g. 1-x then again 1-y)

    @JoinColumn(name = "article$ean", referencedColumnName = "ean")
    @OneToOne(cascade = CascadeType.ALL)
    private Article article$ean;
}

Мой парсер работает так. entry.getKey() устанавливает класс сущности, а entry.getValue() устанавливает отображение

    List<Transaction> transaction = new ArrayList<>();

    HeaderColumnNameTranslateMappingStrategy strategy = new HeaderColumnNameTranslateMappingStrategy();
    strategy.setType(entry.getKey());
    strategy.setColumnMapping(entry.getValue());

    Reader reader = new InputStreamReader(file.getInputStream());
    CSVParser parser = new CSVParserBuilder().withFieldAsNull(CSVReaderNullFieldIndicator.EMPTY_SEPARATORS)
            .withSeparator(delimiter).withIgnoreQuotations(false).build();
    CSVReader csvReader = new CSVReaderBuilder(reader).withSkipLines(0).withCSVParser(parser).build();

    CsvToBean<?> csvToBean = new CsvToBean<>();

    csvToBean.setThrowExceptions(false);
    csvToBean.setMappingStrategy(strategy);
    csvToBean.setCsvReader(csvReader);

    if (entry.getKey().equals(Transaction.class)) {
        transaction.addAll((Collection<? extends Transaction>) csvToBean.parse());
        transaction.forEach(e -> System.out.println(e));
    }

Как я могу справиться с этим?

...