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

}

Ответ

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

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

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

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку