Можно ли из класса контроллера в Java вернуть объект, который сериализуется в JSON
Что проверяют
Понимаете ли вы, кто именно превращает объект в JSON и на каком этапе. Следом спрашивают, чем @RestController отличается от @Controller, как вернуть нужный статус и что делать с полями, которые наружу отдавать нельзя.
Как отвечать
Да, в Spring MVC это основной способ писать REST. Цепочка такая:
@RestController: это@Controllerплюс@ResponseBodyна всех методах. Возвращаемое значение пишется в тело ответа, а не трактуется как имя представления;HttpMessageConverter: Spring выбирает конвертер по типу объекта и заголовкуAccept. Для JSON используется конвертер на базе Jackson, Spring Boot регистрирует его сам, если Jackson есть в classpath (веб-стартер его приносит). В Spring Boot 4 по умолчанию подключается уже Jackson 3, принцип от этого не меняется;ObjectMapper: сериализует объект через геттеры или публичные поля. Record-классы поддерживаются из коробки, и для DTO это удобный вариант.
Управление ответом:
ResponseEntity<T>: статус и заголовки, напримерResponseEntity.status(HttpStatus.CREATED).body(dto);- аннотации Jackson:
@JsonIgnoreпрячет поле,@JsonPropertyменяет имя,@JsonInclude(JsonInclude.Include.NON_NULL)убирает пустые значения,@JsonFormatзадаёт формат даты; - глобальные настройки: свойства
spring.jackson.*вapplication.yml, например формат дат или правило дляnullво всём приложении.
В WebFlux всё то же самое, только метод возвращает Mono<UserDto> или Flux<UserDto>.
Где спотыкаются
Отдают JPA-сущность напрямую. На ленивых связях получают LazyInitializationException, на двусторонних бесконечную рекурсию, а заодно наружу уезжает хэш пароля. Правильный ответ: отдельный DTO.
Возвращают класс без геттеров и с приватными полями. Jackson не находит свойств и падает с InvalidDefinitionException «No serializer found for class». Лечится геттерами, record или настройкой видимости полей.
Пишут @Controller без @ResponseBody и удивляются ошибке. Spring пытается найти шаблон представления по имени, и вместо JSON вы получаете ошибку рендеринга.