Это моя первая попытка сериализации / десериализации вложенного объекта, и теперь я в замешательстве, я использую 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)
Может быть есть какой-нибудь другой простой способ экспорта / импортировать вложенные объекты? Или я делаю это неправильно?