#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. У вас есть какие-либо предложения о том, что мне следует делать вместо этого?