Первое Spring REST API-приложение
Last updated: 11 мая 2025 г.Создадим свое собственное Rest Api
. То есть мы создадим набор методов, к которым можно будет обращаться http запросом по ссылке. Эти методы будут возвращать java объекты конвертированные в JSON тому кто сделал запрос.
Создадим Мавен приложение с такой структурой и файлами:

В файле MainController
будут находиться обработчики, которые будут принимать http запрос, конвертировать java объекты в JSON и отправлять этот JSON обратно тому кто сделал запрос.
В classes
находятся классы, объекты которых будут конвертироваться в JSON.
Теперь давайте добавим необходимые зависимости в pom файл чтобы приложение работало. А именно Jackson для конвертации из JSON в объект и наоборот.
1<project xmlns="http://maven.apache.org/POM/4.0.0"
2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
4 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5 <modelVersion>4.0.0</modelVersion>
6 <groupId>com.MavenWebApp</groupId>
7 <artifactId>RestWEBapp</artifactId>
8 <packaging>jar</packaging>
9 <version>0.0.1-SNAPSHOT</version>
10 <name>hibernateCRUDapp Maven Webapp</name>
11 <url>http://maven.apache.org</url>
12
13 <dependencies>
14
15 <dependency>
16 <groupId>org.springframework</groupId>
17 <artifactId>spring-webmvc</artifactId>
18 <version>5.3.0</version>
19 </dependency>
20
21 <dependency>
22 <groupId>org.springframework</groupId>
23 <artifactId>spring-tx</artifactId>
24 <version>5.3.0</version>
25 </dependency>
26
27 <dependency>
28 <groupId>org.springframework</groupId>
29 <artifactId>spring-orm</artifactId>
30 <version>5.3.0</version>
31 </dependency>
32
33 <dependency>
34 <groupId>org.hibernate</groupId>
35 <artifactId>hibernate-core</artifactId>
36 <version>5.3.26.Final</version>
37 </dependency>
38
39 <dependency>
40 <groupId>mysql</groupId>
41 <artifactId>
42 mysql-connector-java
43 </artifactId>
44 <version>8.0.32</version>
45 </dependency>
46
47 <dependency>
48 <groupId>com.mchange</groupId>
49 <artifactId>c3p0</artifactId>
50 <version>0.9.5.5</version>
51 </dependency>
52
53 <dependency>
54 <groupId>javax.servlet</groupId>
55 <artifactId>
56 javax.servlet-api
57 </artifactId>
58 <version>3.1.0</version>
59 </dependency>
60
61 <dependency>
62 <groupId>javax.servlet</groupId>
63 <artifactId>jstl</artifactId>
64 <version>1.2</version>
65 </dependency>
66
67 <dependency>
68 <groupId>junit</groupId>
69 <artifactId>junit</artifactId>
70 <version>3.8.1</version>
71 <scope>test</scope>
72 </dependency>
73
74 <!-- добавим Jackson для конвертации
75 из json в Java объект -->
76 <dependency>
77 <groupId>
78 com.fasterxml.jackson.core
79 </groupId>
80 <artifactId>jackson-databind</artifactId>
81 <version>2.15.2</version>
82 </dependency>
83
84 </dependencies>
85
86 <build>
87 <plugins>
88 <plugin>
89 <groupId>
90 org.apache.maven.plugins
91 </groupId>
92 <artifactId>maven-war-plugin</artifactId>
93 <version>3.4.0</version>
94 <configuration>
95 <failOnMissingWebXml>
96 false
97 </failOnMissingWebXml>
98 </configuration>
99 </plugin>
100 </plugins>
101 </build>
102</project>
Обработчики в нашем приложении будут конвертировать объект в JSON подобный тому, что приведен ниже.
1{
2 "musician_name": "Behoven",
3 "isclassic": true,
4 "numofoperas": 150,
5 "gratest_works": ["Archduke Trio",
6 "Missa Solemnis", "Symphony No. 5"],
7 "theMostFamousWork": {
8 "work_name": "Symphony No. 3 ‘Eroica",
9 "dedicatedTo": "to Napoleon",
10 "ComposedIn": 1802
11 },
12 "somePropToIgnore": "ignoreMe"
13}
Этот JSON хранит данные о музыканте Bethoven
.
Здесь можно увидеть все типы информации, которые можно хранить в JSON.
В первых трех записях можно увидеть, что можно хранить разные типы данных, в нашем случае – string
, boolean
и int
.
В четвертой записи можно увидеть, что в JSON также можно хранить массивы. Его элементы перечисляются в квадратных скобочках.
В пятой записи можно увидеть, что в JSON также можно хранить вложенный JSON. В нем хранятся данные, которые описывают самую известную работу автора Bethoven
.
Зачем шестая запись дальше будет объеснено.
Давайте создадим класс музыканта объект которого будет конвертироваться в JSON подобный тому, что приведен выше и наоборот должна быть возможность конвертации JSON выше в объект класса ниже. Как можно увидеть он содержит такие же типы информации как и json, который был выше – три поля, массив и вложенный объект. Как уже говорилось для успешной конвертации имена сеттеров и геттеров в этом классе должны содержать имена записей из JSON.
1package com.MavenWebAps.RestWebApp.convertFromJsonjson;
2
3import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
5
6//Аннотация @JsonIgnoreProperties нужна просто
7//чтобы приложение не выдало ошибку если в классе
8//нет каких-то полей, которые есть в JSON, который
9//конвертируется в объект на основе этого класса.
10//В нашем случае это "somePropToIgnore": "ignoreMe".
11//Как можно увидеть в классе ниже нет поля
12//соответствующего записи
13//"somePropToIgnore": "ignoreMe" в JSON.
14@JsonIgnoreProperties(ignoreUnknown=true)
15public class Musician {
16
17 private String musician_name;
18 private boolean isclassic;
19 private int numofoperas;
20 private String[] gratest_works;
21 //В JSON файле приведенном ранее можно
22 //увидеть вложенный JSON: "theMostFamousWork":
23 //{"work_name": "Symphony No. 3 ‘Eroica'", …}
24 //Этот вложенный JSON сконвертируется как
25 //внутренний объект объекта класса Musician.
26 //Класс этого внутреннего объекта нам тоже нужно
27 //создать. Поэтому ниже в следующем примере
28 //кода после текущего создается
29 //класс TheMostFamousWork.
30 private TheMostFamousWork theMostFamousWork;
31
32 public Musician() {
33 }
34
35 public Musician(String musician_name,
36 boolean isclassic, int numofoperas) {
37 this.musician_name = musician_name;
38 this.isclassic = isclassic;
39 this.numofoperas = numofoperas;
40 }
41
42 //Заметьте что названия геттерам и сеттерам даны
43 //в соответствии с именами данных в JSON, то есть
44 //левой части записей. Например сеттер и геттер
45 //ниже для записи "musician_name" : "Behoven"
46 //содержит имя левой части этой записи.
47 //Имена очень важно давать именно такие
48 //чтобы конвертация происходила успешно.
49 public String getMusician_name() {
50 return musician_name;
51 }
52
53 public void setMusician_name(
54 String musician_name) {
55 this.musician_name = musician_name;
56 }
57
58 public boolean isIsclassic() {
59 return isclassic;
60 }
61
62 public void setIsclassic(boolean isclassic) {
63 this.isclassic = isclassic;
64 }
65
66 public int getNumofoperas() {
67 return numofoperas;
68 }
69
70 public void setNumofoperas(int numofoperas) {
71 this.numofoperas = numofoperas;
72 }
73
74 public String[] getGratest_works() {
75 return gratest_works;
76 }
77
78 public void setGratest_works(
79 String[] gratest_works) {
80 this.gratest_works = gratest_works;
81 }
82
83 public TheMostFamousWork getTheMostFamousWork() {
84 return theMostFamousWork;
85 }
86
87 public void setTheMostFamousWork(
88 TheMostFamousWork theMostFamousWork) {
89 this.theMostFamousWork = theMostFamousWork;
90 }
91
92}
Создадим теперь класс вложенного в музыканта объекта.
1*TheMostFamousWork.java
2package com.MavenWebApps.RestWEBApp.convertfromjsoncl;
3
4public class TheMostFamousWork {
5 private String work_name;
6 private String dedicatedTo;
7 private int ComposedIn;
8
9 public TheMostFamousWork() {
10 }
11
12 public String getWork_name() {
13 return work_name;
14 }
15
16 public void setWork_name(String work_name) {
17 this.work_name = work_name;
18 }
19
20 public String getDedicatedTo() {
21 return dedicatedTo;
22 }
23
24 public void setDedicatedTo(String dedicatedTo) {
25 this.dedicatedTo = dedicatedTo;
26 }
27
28 public int getComposedIn() {
29 return ComposedIn;
30 }
31
32 public void setComposedIn(int composedIn) {
33 ComposedIn = composedIn;
34 }
35}
Давайте же создадим Api, то есть набор методов, которые можно вызывать по ссылке используя http запросы. Делается это конечно же в контроллере, который представлен ниже.
1package com.MavenWebAps.RestWEBApp.controller;
2import java.util.ArrayList;
3
4//Напишем свое REST Api!
5//В Spring MVC для обработки http методов и автоматической
6//конвертации из JSON в java объекты используеться
7//@RestController вместо @Controller, который был раньше.
8@RestController
9public class MainController {
10 //Этим обработчиком просто отправляем в ответ
11 //тому кто сделал запрос по адресу /getMusician
12 //объект класса Musician в JSON формате.
13 //Конвертация Java объектов в JSON и наоборот
14 //происходит "за кулисами" средствами Jackson,
15 //ничего специального для конвертации делать
16 //не нужно. Просто возвращаем объект из метода
17 //и он автоматически отправляеться тому кто
18 //вызвал метод по ссылке /getMusician
19 //в JSON формате.
20 @RequestMapping("/getMusician")
21 public Musician getMusician() {
22 return new Musician("Bethoven",true,150);
23 }
24
25 //Помним что результат запроса SELECT для извлечения
26 //нескольких записей из таблицы, который совершаеться
27 //средствами hibernate, записываеться в List.
28 //Соответственно удобно будет сразу отправлять клиенту
29 //этот List с извлеченными данными таблицы как ответ.
30 //С помощью Jackson можно отправить List в JSON формате.
31 //Обработчик ниже возвращает клиенту List JAVA объектов
32 //в формате JSON. Конвертация Java объектов в JSON
33 //происходит "за кулисами" средствами Jackson.
34 //Нашему API нужно просто вернуть List с обьектами
35 //и клиент получит объекты списка в формате JSON.
36 @RequestMapping("/getMusicians")
37 public List<Musician> getMusicians() {
38 List<Musician> musicians = new ArrayList<Musician>();
39 musicians.add(new Musician("Bethoven",true,150));
40 musicians.add(new Musician("Mozart",true,250));
41 musicians.add(new Musician("Bach",true,120));
42 //Возвращаем List
43 return musicians;
44 //То есть можно отправить не один объект
45 //как это делает прошлый обработчик, а сразу много.
46 }
47
48 //Чтобы клиент мог получить конкретного музыканта из списка
49 //он может передать число в путь как показано ниже.
50 //Это число это индекс в списке и по этому индексу извлекается
51 //конкретный музыкант в списке.
52 @RequestMapping("/getSingleMusicianFromList/{musicianID}")
53 //Аннотация @PathVariable позволяет получить этот
54 //индекс из пути запроса. Имя аргумента метода должно
55 //совпадать с именем переменной в URL.
56 public Musician getSingleMusicianFromList(
57 @PathVariable int musicianID) {
58 List<Musician> musicians = new ArrayList<Musician>();
59 musicians.add(new Musician("Bethoven",true,150));
60 musicians.add(new Musician("Mozart",true,250));
61 musicians.add(new Musician("Bach",true,120));
62 //С помощью get достаем из списка нужного музыканта
63 //исходя из переданного клиентом числа и отправляем
64 //его клиенту в JSON формате.
65 return musicians.get(musicianID);
66 }
67}
Давайте проверим первый обработчик. Вернет ли он нам объект музыканта Bethoven
в формате JSON.
Вообще тест можно было бы совершить через адресную строку браузера, как раньше, поскольку в нашем приложении пока только Get запросы, но будем привыкать к Rest Client, так как скоро появятся и post запросы с помощью которых клиентом будет отправляться JSON в обработчик и другие виды запросов.
Перейдем по ссылке getMusician
чтобы сделать запрос к первому обработчику:

Как видим обработчик успешно создал объект, конвертировал его в JSON и отправил этот JSON как ответ на запрос.
Кстати, как можно было заметить, вложенный объект мы не создавали, он null
. Это было сделано просто чтобы не было слишком много JSON и чтобы показать, что можно конвертировать и отправлять не полностью заполненный объект.
Далее протестируем второй обработчик. Как мы помним, он должен возвращать много объектов конвертированных в JSON.

Как видим, обработчик успешно конвертировал объекты в списке в JSON и отправил эти JSON как ответ на запрос.
Теперь давайте с помощью третьего обработчика извлечем из списка объектов второй объект. Как мы помним счет начинается с нуля, поэтому чтобы обратиться ко второму элементу в списке пишем в конце ссылки 1.

Как мы помним, второй музыкант в списке был моцарт и как мы видим обработчик успешно его выбрал из списка и прислал в формате JSON.
Дополнительные материалы
Следующие уроки
Создание REST API CRUD приложения
20
мин.
Spring Boot: в чём его сила и удобство?
22
мин.
Создание Spring Boot CRUD-приложения
20
мин.