Получить доступ

Добавь эндпоинт GET /users/{id}, возвращающий User по идентификатору.

JuniorSpring MVC и RESTSpringSpring Boot
Ещё спрашивают так:
  • Напишите REST-контроллер для получения пользователя.
Коротко

@RestController с @GetMapping("/users/{id}") и @PathVariable; сервис возвращает Optional → 200 с DTO или 404; наружу отдавать DTO, а не сущность JPA.

  • Внедрение сервиса через конструктор
  • 404 — ResponseEntity.of(optional) или исключение + @RestControllerAdvice
  • DTO не раскрывает пароль и ленивые связи

А ещё Тест — @WebMvcTest с MockMvc

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Что ожидают увидеть — аккуратный минимум:

  • контроллер тонкий: только HTTP — разбор запроса и формирование ответа;
  • сервис внедрён через конструктор;
  • отсутствие пользователя — 404, а не 200 с null и не 500;
  • ответ — DTO (record) с нужными полями. Отдавать сущность JPA — риск утечки полей (хеш пароля), LazyInitializationException и циклов при сериализации;
  • тип идентификатора — long или UUID, Spring сам преобразует строку пути; неверный формат — 400.

Обработка 404 — два способа: ResponseEntity.of(optional) (вернёт 404 для пустого Optional) или бросить своё UserNotFoundException и превратить его в ProblemDetail в @RestControllerAdvice. Второй лучше, когда таких мест много.

Плюсы, которые стоит проговорить: проверка прав (может ли текущий пользователь видеть этого), тест на @WebMvcTest с MockMvc и @MockitoBean для сервиса (Spring Boot 3.4+; раньше @MockBean).

Пример

@RestController
@RequestMapping("/users")
class UserController {
    private final UserService users;
    UserController(UserService users) { this.users = users; }

    @GetMapping("/{id}")
    ResponseEntity<UserDto> get(@PathVariable long id) {
        return ResponseEntity.of(users.find(id).map(UserDto::from));   // 200 или 404
    }
}

record UserDto(long id, String name, String email) {
    static UserDto from(User u) { return new UserDto(u.getId(), u.getName(), u.getEmail()); }
}

Что хотят услышать

  • Аннотации контроллера и параметр пути.
  • 404 при отсутствии.
  • DTO вместо сущности.
  • Тест через MockMvc — плюс.

Частые ошибки

  • Возвращать сущность JPA.
  • Возвращать null с кодом 200.

Что спросят дальше

  • Как вернуть 404?
  • Чем @PathVariable отличается от @RequestParam?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем