В представленном контроллере есть несколько проблем:
package com.example.photogallery.controller;
В представленном контроллере есть несколько проблем:
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
package com.example.photogallery.controller;
import com.example.photogallery.model.Photo; import com.example.photogallery.service.PhotoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList; import java.util.List;
@RestController @RequestMapping("/api/photos") public class PhotoController {
@Autowired
private PhotoService photoService;
private List<Photo> photos = new ArrayList<>();
private static Integer totalCount = 0;
@GetMapping
public List<Photo> getAllPhotos() {
return photos;
}
@PostMapping("/upload")
public String uploadPhoto(@RequestParam("file") MultipartFile file) {
try {
Photo photo = new Photo();
photo.setFileName(file.getOriginalFilename());
photo.setFileSize(file.getSize());
photo.setContentType(file.getContentType());
photos.add(photo);
totalCount++;
photoService.savePhoto(photo);
return "Photo uploaded successfully";
} catch (Exception e) {
return "Error uploading photo";
}
}
@GetMapping("/count")
public Integer getCount() {
return totalCount;
}
@DeleteMapping("/{id}")
public void deletePhoto(@PathVariable Long id) {
for (Photo photo : photos) {
if (photo.getId().equals(id)) {
photos.remove(photo);
totalCount--;
photoService.deletePhoto(id);
break;
}
}
}
@GetMapping("/search")
public List<Photo> searchPhotos(@RequestParam(required = false) String query) {
if (query.isEmpty()) {
return photos;
}
List<Photo> results = new ArrayList<>();
for (int i = 0; i < photos.size(); i++) {
if (photos.get(i).getFileName().contains(query)) {
results.add(photos.get(i));
}
}
return results;
}
}
Ответ
В представленном контроллере есть несколько проблем:
- Хранение данных в памяти контроллера: список
photosи счетчикtotalCountнаходятся в контроллере, что не подходит для многопоточной среды и не сохраняется между перезапусками приложения. - Потенциальные проблемы с удалением из списка во время итерации: удаление элемента из списка внутри цикла
forпо этому же списку может привести кConcurrentModificationException. - Проверка
query.isEmpty()без проверки на null: может вызватьNullPointerException. - Отсутствие обработки ошибок и HTTP-статусов: методы возвращают строки или void, лучше использовать ResponseEntity с соответствующими статусами.
- Отсутствие синхронизации: при одновременных запросах возможны проблемы с консистентностью данных.
Рекомендации:
- Перенести хранение фотографий в сервис или базу данных.
- Использовать потокобезопасные коллекции или синхронизацию.
- В методе удаления использовать итератор или фильтрацию.
- Добавить проверку на null для параметров.
- Возвращать корректные HTTP-ответы.
Пример исправления удаления:
@DeleteMapping("/{id}")
public ResponseEntity<Void> deletePhoto(@PathVariable Long id) {
boolean removed = photos.removeIf(photo -> photo.getId().equals(id));
if (removed) {
totalCount--;
photoService.deletePhoto(id);
return ResponseEntity.ok().build();
} else {
return ResponseEntity.notFound().build();
}
}
И лучше хранить данные в базе через сервис, а не в контроллере.