Первое Spring REST API-приложение

Создадим свое собственное Rest Api. То есть мы создадим набор методов, к которым можно будет обращаться http запросом по ссылке. Эти методы будут возвращать java объекты конвертированные в JSON тому кто сделал запрос.

Создадим Мавен приложение с такой структурой и файлами:

В файле MainController будут находиться обработчики, которые будут принимать http запрос, конвертировать java объекты в JSON и отправлять этот JSON обратно тому кто сделал запрос.

В classes находятся классы, объекты которых будут конвертироваться в JSON.

Теперь давайте добавим необходимые зависимости в pom файл чтобы приложение работало. А именно Jackson для конвертации из JSON в объект и наоборот.

4.0.0 com.MavenWebApp RestWEBapp jar 0.0.1-SNAPSHOT hibernateCRUDapp Maven Webapp http://maven.apache.org org.springframework spring-webmvc 5.3.0 org.springframework spring-tx 5.3.0 org.springframework spring-orm 5.3.0 org.hibernate hibernate-core 5.3.26.Final mysql mysql-connector-java 8.0.32 com.mchange c3p0 0.9.5.5 javax.servlet javax.servlet-api 3.1.0 javax.servlet jstl 1.2 junit junit 3.8.1 test com.fasterxml.jackson.core jackson-databind 2.15.2 org.apache.maven.plugins maven-war-plugin 3.4.0 false

Обработчики в нашем приложении будут конвертировать объект в JSON подобный тому, что приведен ниже.

{ “musician_name”: “Behoven”, “isclassic”: true, “numofoperas”: 150, “gratest_works”: [“Archduke Trio”, “Missa Solemnis”, “Symphony No. 5”], “theMostFamousWork”: { “work_name”: “Symphony No. 3 ‘Eroica”, “dedicatedTo”: “to Napoleon”, “ComposedIn”: 1802 }, “somePropToIgnore”: “ignoreMe” }

Этот JSON хранит данные о музыканте Bethoven.

Здесь можно увидеть все типы информации, которые можно хранить в JSON.

В первых трех записях можно увидеть, что можно хранить разные типы данных, в нашем случае – string, boolean и int.

В четвертой записи можно увидеть, что в JSON также можно хранить массивы. Его элементы перечисляются в квадратных скобочках.

В пятой записи можно увидеть, что в JSON также можно хранить вложенный JSON. В нем хранятся данные, которые описывают самую известную работу автора Bethoven.

Зачем шестая запись дальше будет объеснено.

Давайте создадим класс музыканта объект которого будет конвертироваться в JSON подобный тому, что приведен выше и наоборот должна быть возможность конвертации JSON выше в объект класса ниже. Как можно увидеть он содержит такие же типы информации как и json, который был выше – три поля, массив и вложенный объект. Как уже говорилось для успешной конвертации имена сеттеров и геттеров в этом классе должны содержать имена записей из JSON.

package com.MavenWebAps.RestWebApp.convertFromJsonjson; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; //Аннотация @JsonIgnoreProperties нужна просто //чтобы приложение не выдало ошибку если в классе //нет каких-то полей, которые есть в JSON, который //конвертируется в объект на основе этого класса. //В нашем случае это “somePropToIgnore”: “ignoreMe”. //Как можно увидеть в классе ниже нет поля //соответствующего записи //”somePropToIgnore”: “ignoreMe” в JSON. @JsonIgnoreProperties(ignoreUnknown=true) public class Musician { private String musician_name; private boolean isclassic; private int numofoperas; private String[] gratest_works; //В JSON файле приведенном ранее можно //увидеть вложенный JSON: “theMostFamousWork”: //{“work_name”: “Symphony No. 3 ‘Eroica'”, …} //Этот вложенный JSON сконвертируется как //внутренний объект объекта класса Musician. //Класс этого внутреннего объекта нам тоже нужно //создать. Поэтому ниже в следующем примере //кода после текущего создается //класс TheMostFamousWork. private TheMostFamousWork theMostFamousWork; public Musician() { } public Musician(String musician_name, boolean isclassic, int numofoperas) { this.musician_name = musician_name; this.isclassic = isclassic; this.numofoperas = numofoperas; } //Заметьте что названия геттерам и сеттерам даны //в соответствии с именами данных в JSON, то есть //левой части записей. Например сеттер и геттер //ниже для записи “musician_name” : “Behoven” //содержит имя левой части этой записи. //Имена очень важно давать именно такие //чтобы конвертация происходила успешно. public String getMusician_name() { return musician_name; } public void setMusician_name( String musician_name) { this.musician_name = musician_name; } public boolean isIsclassic() { return isclassic; } public void setIsclassic(boolean isclassic) { this.isclassic = isclassic; } public int getNumofoperas() { return numofoperas; } public void setNumofoperas(int numofoperas) { this.numofoperas = numofoperas; } public String[] getGratest_works() { return gratest_works; } public void setGratest_works( String[] gratest_works) { this.gratest_works = gratest_works; } public TheMostFamousWork getTheMostFamousWork() { return theMostFamousWork; } public void setTheMostFamousWork( TheMostFamousWork theMostFamousWork) { this.theMostFamousWork = theMostFamousWork; } }

Создадим теперь класс вложенного в музыканта объекта.

*TheMostFamousWork.java package com.MavenWebApps.RestWEBApp.convertfromjsoncl; public class TheMostFamousWork { private String work_name; private String dedicatedTo; private int ComposedIn; public TheMostFamousWork() { } public String getWork_name() { return work_name; } public void setWork_name(String work_name) { this.work_name = work_name; } public String getDedicatedTo() { return dedicatedTo; } public void setDedicatedTo(String dedicatedTo) { this.dedicatedTo = dedicatedTo; } public int getComposedIn() { return ComposedIn; } public void setComposedIn(int composedIn) { ComposedIn = composedIn; } }

Давайте же создадим Api, то есть набор методов, которые можно вызывать по ссылке используя http запросы. Делается это конечно же в контроллере, который представлен ниже.

package com.MavenWebAps.RestWEBApp.controller; import java.util.ArrayList; //Напишем свое REST Api! //В Spring MVC для обработки http методов и автоматической //конвертации из JSON в java объекты используеться //@RestController вместо @Controller, который был раньше. @RestController public class MainController { //Этим обработчиком просто отправляем в ответ //тому кто сделал запрос по адресу /getMusician //объект класса Musician в JSON формате. //Конвертация Java объектов в JSON и наоборот //происходит “за кулисами” средствами Jackson, //ничего специального для конвертации делать //не нужно. Просто возвращаем объект из метода //и он автоматически отправляеться тому кто //вызвал метод по ссылке /getMusician //в JSON формате. @RequestMapping(“/getMusician”) public Musician getMusician() { return new Musician(“Bethoven”,true,150); } //Помним что результат запроса SELECT для извлечения //нескольких записей из таблицы, который совершаеться //средствами hibernate, записываеться в List. //Соответственно удобно будет сразу отправлять клиенту //этот List с извлеченными данными таблицы как ответ. //С помощью Jackson можно отправить List в JSON формате. //Обработчик ниже возвращает клиенту List JAVA объектов //в формате JSON. Конвертация Java объектов в JSON //происходит “за кулисами” средствами Jackson. //Нашему API нужно просто вернуть List с обьектами //и клиент получит объекты списка в формате JSON. @RequestMapping(“/getMusicians”) public List getMusicians() { List musicians = new ArrayList(); musicians.add(new Musician(“Bethoven”,true,150)); musicians.add(new Musician(“Mozart”,true,250)); musicians.add(new Musician(“Bach”,true,120)); //Возвращаем List return musicians; //То есть можно отправить не один объект //как это делает прошлый обработчик, а сразу много. } //Чтобы клиент мог получить конкретного музыканта из списка //он может передать число в путь как показано ниже. //Это число это индекс в списке и по этому индексу извлекается //конкретный музыкант в списке. @RequestMapping(“/getSingleMusicianFromList/{musicianID}”) //Аннотация @PathVariable позволяет получить этот //индекс из пути запроса. Имя аргумента метода должно //совпадать с именем переменной в URL. public Musician getSingleMusicianFromList( @PathVariable int musicianID) { List musicians = new ArrayList(); musicians.add(new Musician(“Bethoven”,true,150)); musicians.add(new Musician(“Mozart”,true,250)); musicians.add(new Musician(“Bach”,true,120)); //С помощью get достаем из списка нужного музыканта //исходя из переданного клиентом числа и отправляем //его клиенту в JSON формате. return musicians.get(musicianID); } }

Давайте проверим первый обработчик. Вернет ли он нам объект музыканта Bethoven в формате JSON.

Вообще тест можно было бы совершить через адресную строку браузера, как раньше, поскольку в нашем приложении пока только Get запросы, но будем привыкать к Rest Client, так как скоро появятся и post запросы с помощью которых клиентом будет отправляться JSON в обработчик и другие виды запросов.

Перейдем по ссылке getMusician чтобы сделать запрос к первому обработчику:

Как видим обработчик успешно создал объект, конвертировал его в JSON и отправил этот JSON как ответ на запрос.

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

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

Как видим, обработчик успешно конвертировал объекты в списке в JSON и отправил эти JSON как ответ на запрос.

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

Как мы помним, второй музыкант в списке был моцарт и как мы видим обработчик успешно его выбрал из списка и прислал в формате JSON.

Создание REST API CRUD приложения

Пошаговое создание RESTful API для CRUD операций. Обмен данными в JSON, работа с EntityManager и Hibernate SessionFactory.

Time to read: 20

Spring Boot: в чём его сила и удобство?

Преимущества Spring Boot: автоконфигурация, встроенный Tomcat, starter-зависимости. Настройка через Spring Initializr и application.properties.

Time to read: 22

Создание Spring Boot CRUD-приложения

Spring Boot + JPA + Hibernate: создание CRUD API. EntityManager для работы с разными реализациями JPA. Настройка через application.properties.

Time to read: 20