Добавь эндпоинт GET /users/{id}, возвращающий User по идентификатору.
- Напишите REST-контроллер для получения пользователя.
@RestController с @GetMapping("/users/{id}") и @PathVariable; сервис возвращает Optional → 200 с DTO или 404; наружу отдавать DTO, а не сущность JPA.
- Внедрение сервиса через конструктор
- 404 — ResponseEntity.of(optional) или исключение + @RestControllerAdvice
- DTO не раскрывает пароль и ленивые связи
А ещё Тест — @WebMvcTest с MockMvc
Подробно
Что ожидают увидеть — аккуратный минимум:
- контроллер тонкий: только 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?
Разбор темы
- REST API: статусы, согласование и семантика
Ресурсы и HTTP-глаголы, статус-коды как контракт, content negotiation и message converters, идемпотентность и версионирование.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.