Функция карты Котлина изменяет все дочерние объекты на первой итерации

#java #spring #kotlin

Вопрос:

У меня проблема, когда я пытаюсь выполнить итерацию по массиву объектов и изменить все изображения на base64, включая дочерние объекты. Когда я это делаю, объекты (задание) меняются один за другим, как и ожидается от функции карты, но когда я хочу, чтобы дочерний объект изменялся каждые итерации, он делает что-то странное. На первой итерации первый объект (Задание) преобразует изображение правильно, но когда карта пыталась изменить дочерний объект (Компанию), она изменяет все другие родительские объекты (Задание), дочерние объекты (Компанию), которые имеют ссылку на изображение, поэтому при запуске второй итерации ссылки на изображения исчезают и приложение завершает работу (но только все дочерние ссылки (Компания) изменяются на первой итерации).

Визуальное представление:

Запустите первую итерацию: http://prntscr.com/18ijsnq

Конец первой итерации: http://prntscr.com/18ik1cy

Начало второй итерации: http://prntscr.com/18ik97w

Как вы можете видеть, дочерние объекты компании изменились для всех объектов задания в массиве, но я ожидаю, что они будут меняться один за другим для каждой итерации.

Это моя модель данных:

введите описание изображения здесь

Код с картой:

     @GetMapping
fun getAllJobs(): ResponseEntity<*> {
    return try {
        val jobList: List<Job> = jobRepository.findAll()
        jobList.map {
            val file = FileUtils.readFileToByteArray(File("images/job/"   it.jobImage))
            val companyFile = FileUtils.readFileToByteArray(File("images/company/"   it.company.logo))
            it.company.logo = "data:image/jpeg;base64,"   Base64.getEncoder().encodeToString(companyFile)
            it.jobImage = "data:image/jpeg;base64,"   Base64.getEncoder().encodeToString(file)
        }
        JsonDataResponse(HttpStatus.OK, "Retrieved lists of jobs ", jobList).createResponseEntity()
    } catch (e: Exception) {
        JsonResponse(HttpStatus.INTERNAL_SERVER_ERROR, e.stackTraceToString()).createResponseEntity()
    }
}
 

Моя попытка с MapIndexed:

     @GetMapping
fun getAllJobs(): ResponseEntity<*> {
    return try {
        val jobList: List<Job> = jobRepository.findAll()
        jobList.mapIndexed { i: Int, job: Job ->
            val file = FileUtils.readFileToByteArray(File("images/job/"   job.jobImage))
            val companyFile = FileUtils.readFileToByteArray(File("images/company/"   jobList[i].company.logo))
            jobList[i].company.logo = "data:image/jpeg;base64,"   Base64.getEncoder().encodeToString(companyFile)
            job.jobImage = "data:image/jpeg;base64,"   Base64.getEncoder().encodeToString(file)
        }
        JsonDataResponse(HttpStatus.OK, "Retrieved lists of jobs ", jobList).createResponseEntity()
    } catch (e: Exception) {
        JsonResponse(HttpStatus.INTERNAL_SERVER_ERROR, e.stackTraceToString()).createResponseEntity()
    }
}
 

Трассировка стека:

 > java.io.FileNotFoundException: File 'imagescompanydata:imagejpeg;base64,9j4AAQSkZJRgABAQAAAQABAAD...AAAAAAHZ' does not exist
    at org.apache.commons.io.FileUtils.openInputStream(FileUtils.java:297) ~[commons-io-2.6.jar:2.6]
    at org.apache.commons.io.FileUtils.readFileToByteArray(FileUtils.java:1851) ~[commons-io-2.6.jar:2.6]
    at com.example.bouwershub.controllers.JobController.getAllJobs(JobController.kt:32) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at.... 
 

Почему это происходит?

Комментарии:

1. очевидно, Company что объект разделяется между разными jobs . у вас не может быть другого логотипа для одного и того же company в разных Job объектах. PS: не следует использовать map для этого действия

2. У вас есть какие-либо предложения о том, что мне следует делать вместо этого?