возникли проблемы с разбором CSVtoBean из CSV-файла - PullRequest
0 голосов
/ 04 мая 2020

Это моя первая попытка сериализации / десериализации вложенного объекта, и теперь я в замешательстве, я использую opencsv с аннотациями bean-компонентов. Получение ошибок при разборе List в объекте Project. И не могу двигаться вперед для сохранения обратно в базу данных.

Project. java

public class Project {

    @CsvBindByName
    private String projectName;
    @CsvBindByName
    private String projectDescription;
    @CsvBindByName
    private String projectManager;

    @CsvBindAndSplitByName(elementType= Task.class, splitOn = "\\|", converter = TextToTask.class)
    private List<Task> tasks;

Вот мой класс писателя BeantoCSV. кто создает CSV-файл.

openCSVWritter. java

public static void openCSVWriter(List<Project> project) throws IOException {

            Writer writer = new FileWriter("serialize/allProjects.csv");
        StatefulBeanToCsv<Project> beanToCsv = new StatefulBeanToCsvBuilder<Project>(writer).build();

        try {
            beanToCsv.write(project);
        } catch (CsvDataTypeMismatchException e1) {
            e1.printStackTrace();
        } catch (CsvRequiredFieldEmptyException e1) {
            e1.printStackTrace();
        }
        writer.close();
    }

Класс задач не имеет аннотаций, поэтому показывать его не нужно. Я создал класс TextTo .. для конвертера. и немного подправил. Создана рекурсия для чтения файла

TextToTask.class

public class TextToTask extends AbstractCsvConverter {

    private static final String HIGH = "HIGH";
    private static final String MEDIUM = "MEDIUM";
    private static final String LOW = "LOW";
    private static final String COMPLETE = "COMPLETE";
    private static final String CANCELED = "CANCELED";
    private static final String IN_PROGRESS = "IN_PROGRESS";
    private static final String STARTED = "STARTED";
    private static Task newTask;


    @Override
    public List<Task> convertToRead(String value) {
    List<Task> tasks = new ArrayList<>();
    String[] split = value.split("\\*");

    int tasksToRead = split.length / 4;
    int counter = 0;
    for (int i = 0; i < tasksToRead; i++) {
        newTask = new Task();
        for (int j = 0; j < 1; j++) {

        newTask.setTaskName(split[counter++]);
        newTask.setTaskDescription(split[counter++]);
        if (split[counter].matches(HIGH)) {
            newTask.setTaskPriority(Priority.HIGH);
            counter++;
        } else if (split[counter].matches(MEDIUM)) {
            newTask.setTaskPriority(Priority.MEDIUM);
            counter++;
        } else if (split[counter].matches(LOW)) {
            newTask.setTaskPriority(Priority.LOW);
            counter++;
        } else if (split[counter].matches(COMPLETE)) {
            newTask.setTaskStatus(TaskStatus.COMPLETE);
            counter++;
        } else if (split[counter].matches(CANCELED)) {
            newTask.setTaskStatus(TaskStatus.CANCELED);
            counter++;
        } else if (split[counter].matches(IN_PROGRESS)) {
            newTask.setTaskStatus(TaskStatus.IN_PROGRESS);
            counter++;
        } else if (split[counter].matches(STARTED)) {
            newTask.setTaskStatus(TaskStatus.STARTED);
            counter++;
        }
        counter++;
        }
        tasks.add(newTask);
    }

    return tasks;
    }

    @Override
    public String convertToWrite(Object value) {
    Task printValue = (Task) value;

    return String.format("%s*%s*%s*%s*", printValue.getTaskName(), printValue.getTaskDescription(),
        printValue.getTaskPriority(), printValue.getTaskStatus());

    }

}

А теперь читатель,

openCSVbeadReader. java

public static void beanBuilder() throws Exception {

         BufferedReader fileReader = null;

            try {
              fileReader = new BufferedReader(new FileReader("serialize/allProjects.csv"));

              List<Project> parsedProjects = new CsvToBeanBuilder<Project>(fileReader)
                  .withType(Project.class).build().parse();

              Project project1 = parsedProjects.get(0);

              System.out.println("Project name: "+project1.getProjectName());
              System.out.println("Project Desc: "+ project1.getProjectDescription());
              System.out.println("Project tasks:" + project1.getTasks());

              List<Task> task = project1.getTasks();

              System.out.println("Tasks as list "+task);
              System.out.println("Get Task 1:" +task.get(0));

              Task helpme = task.get(0);


            } catch (Exception e) {
              System.out.println("Reading CSV Error!");
              e.printStackTrace();
            } finally {
              try {
                fileReader.close();
              } catch (IOException e) {
                System.out.println("Closing fileReader/csvParser Error!");
                e.printStackTrace();
              }
            }
          }

И вот результаты, которые я получаю.

консоль

Project name: project 1
Project Desc: A test project
Project tasks:[[Task(taskId=null, taskName=task1, taskDescription=of project 1, project=null, taskStatus=null, taskPriority=HIGH, taskCreatedOn=null, taskModifiedOn=null, taskDeadline=null)]]
Tasks as list [[Task(taskId=null, taskName=task1, taskDescription=of project 1, project=null, taskStatus=null, taskPriority=HIGH, taskCreatedOn=null, taskModifiedOn=null, taskDeadline=null)]]
Get Task 1:[Task(taskId=null, taskName=task1, taskDescription=of project 1, project=null, taskStatus=null, taskPriority=HIGH, taskCreatedOn=null, taskModifiedOn=null, taskDeadline=null)]
Reading CSV Error!
java.lang.ClassCastException: class java.util.ArrayList cannot be cast to class com.project.entity.Task (java.util.ArrayList is in module java.base of loader 'bootstrap'; com.project.entity.Task is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @11e2c925)
    at com.project.serialization.OpenCSWReader.beanBuilderExample(OpenCSWReader.java:113)

Может быть есть какой-нибудь другой простой способ экспорта / импортировать вложенные объекты? Или я делаю это неправильно?

...