Sobes.tech
Назад к вопросам
Junior
14

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; } }

Компании, где спрашивали
ARTW

Ответ от нейросети

sobes.tech AI

В представленном контроллере есть несколько проблем:

  1. Хранение данных в памяти контроллера: список photos и счетчик totalCount находятся в контроллере, что не подходит для многопоточной среды и не сохраняется между перезапусками приложения.

  2. Потенциальные проблемы с удалением из списка во время итерации: удаление элемента из списка внутри цикла for по этому же списку может привести к ConcurrentModificationException.

  3. Проверка query.isEmpty() без проверки на null: может вызвать NullPointerException.

  4. Отсутствие обработки ошибок и HTTP-статусов: методы возвращают строки или void, лучше использовать ResponseEntity с соответствующими статусами.

  5. Отсутствие синхронизации: при одновременных запросах возможны проблемы с консистентностью данных.

Рекомендации:

  • Перенести хранение фотографий в сервис или базу данных.
  • Использовать потокобезопасные коллекции или синхронизацию.
  • В методе удаления использовать итератор или фильтрацию.
  • Добавить проверку на 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();
    }
}

И лучше хранить данные в базе через сервис, а не в контроллере.