Контроллер и JSON
REST API — это набор адресов, по которым другие программы (сайт на JavaScript, мобильное приложение, другой сервер) получают и меняют данные. Обмениваются они обычно в формате JSON. В Spring такие адреса обслуживает контроллер — класс с аннотацией @RestController.
Первый контроллер API
Создайте файл рядом с PostService.java:
// src/main/java/com/example/blog/PostController.java
package com.example.blog;
import java.util.List;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PostController {
private final PostService postService;
public PostController(PostService postService) {
this.postService = postService;
}
@GetMapping("/api/posts")
public List<Post> list() {
return postService.findAll();
}
}@GetMapping("/api/posts") связывает метод с запросом GET /api/posts. Метод возвращает обычный список записей, а не текст ответа — превращением в JSON займётся Spring.
Проверка
Перезапустите приложение и вызовите адрес:
curl -i http://localhost:8080/api/postsHTTP/1.1 200
Content-Type: application/json
Content-Length: 2
[]Статей пока нет, поэтому пришёл пустой массив. Заголовок Content-Type: application/json сообщает клиенту, что в ответе JSON.
Как объект становится JSON
В стартер spring-boot-starter-webmvc входит библиотека Jackson. Она берёт компоненты записи и превращает их в поля JSON. Когда в следующих уроках мы научимся добавлять статьи, тот же адрес вернёт:
[{"id":1,"title":"Привет, Spring","body":"Первая статья","author":"anna","createdAt":"2026-10-04T08:50:07.494425300Z"}]Каждый компонент записи Post стал полем с тем же именем. Дата типа Instant записана в стандартном формате ISO-8601, null превратился бы в null.
@RestController и @Controller
| Аннотация | Что возвращает метод |
|---|---|
@RestController | Данные: объект превращается в JSON |
@Controller | Имя HTML-шаблона страницы |
@RestController — это @Controller плюс @ResponseBody на каждом методе. Страницы на шаблонах будут в пятой главе, а пока все контроллеры — @RestController.
Где держать адреса
Принято начинать адреса API с /api, а для коллекции объектов использовать существительное во множественном числе: /api/posts, /api/comments, /api/users. Так адреса API не пересекаются со страницами сайта.
Частая ошибка
Jackson видит только то, что доступно снаружи: компоненты записи или публичные методы-геттеры getTitle(). Если вернуть объект обычного класса с приватными полями и без геттеров, ошибки не будет — придёт ответ 200 с пустым объектом {}. Поля просто молча пропадут. Для ответов API используйте записи — у них всё нужное уже есть.