Статьи

Restful API с использованием Spring Rest & Spring Data JPA & H2 с примером Spring Boot

Привет друзья,

В этом уроке вы узнаете следующее:

1. Настройка Spring Rest, Spring Data JPA и H2 в Spring Boot
2. Пример Spring Rest, Spring Data JPA и H2 для создания конечных точек остальных служб с помощью Spring Boot
3. Использование Swagger для проверки конечных точек Restful

1. Настройка Spring Rest, Spring Data JPA и H2 в Spring Boot

Перейдите на https://start.spring.io/ и создайте проект с именем springRestAndDataJpaWithSpringBoot и со следующими зависимостями:

— Интернет

— JPA

— H2

Restful API

Примечание. Если вы не знакомы с созданием проекта Spring Boot с помощью Spring Initializer, я бы порекомендовал следовать одному из моих предыдущих постов, Как создать проект Spring Boot с помощью Spring Initializer, где я подробно объяснил, как мы можем создать проект Spring Boot. используя Spring Initializer.

2. Пример Spring Rest, Spring Data JPA и H2 для создания конечных точек остальных служб с помощью Spring Boot

В этом примере мы собираемся создать конечные точки отдыха для:

— Создать ресурс сотрудника

— Получить список сотрудников

— Получить сотрудника

— Обновить ресурс сотрудника

— Удалить ресурс сотрудника

Ниже приводится окончательная структура каталогов проекта:

Restful API

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

Шаг 1

Экспортируйте проект springRestAndDataJpaWithSpringBoot (созданный вами через Spring Initializer) из вашего каталога в Eclipse.

Шаг 2

Откройте Pom.xml.It должен иметь все зависимости, которые вы добавили с сайта Spring Initializer вместе с некоторыми зависимостями по умолчанию.

Кроме того, я вручную добавил зависимости, чтобы включить Swagger. Swagger в основном используется для проверки конечных точек отдыха.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?xml version="1.0" encoding="UTF-8"?>
 
 
<modelVersion>4.0.0</modelVersion>
<groupId>nl.blogspot.javasolutionsguide</groupId>
<artifactId>springRestAndDataJpaWithSpringBoot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springRestAndDataJpaWithSpringBoot</name>
 
<description>Demo project for Spring Boot</description>
 
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
 
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
 
<dependencies>
 
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
 
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
 
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
 
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
 
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
 
 
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
 
</dependencies>
 
<build>
 
<plugins>
 <plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
 </plugin>
</plugins>
 
</build>
 
</project>

Шаг 3

Spring boot автоматически создал файл Java с именем SpringRestAndDataJpaWithSpringBootApplication. Этот класс используется для запуска приложения Spring Boot. Нам нужно сделать следующее в этом классе:

— Включить чванство

Мы уже добавили зависимости для Swagger в Pom.xml. Наряду с этим, чтобы включить swagger при загрузке Spring, нам нужно поместить аннотацию @ EnableSwagger2 в верхней части
SpringRestAndDataJpaWithSpringBootApplication class.

— Скажите Spring Boot, какие пакеты сканировать, чтобы рассматривать бины, которые будут управляться Spring

Нам нужно использовать @ComponentScan (basePackages = «nl.blogspot.javasolutionsguide.springRestAndDataJpaWithSpringBoot») поверх класса SpringRestAndDataJpaWithSpringBootApplication.

Шаг 4

Создать сущность Сотрудник

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package nl.blogspot.javasolutionsguide.springRestAndDataJpaWithSpringBoot.entity;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
 
/**
 * @author JavaSolutionsGuide
 *
 */
@Entity
@Table(name="EMPLOYEE")
public class Employee {
  
 @Id
 @GeneratedValue(strategy= GenerationType.IDENTITY)
 private Long id;
  
 @Column(name="EMPLOYEE_NAME")
 private String name;
  
 @Column(name="EMPLOYEE_SALARY")
 private Integer salary;
  
 @Column(name="DEPARTMENT")
 private String department;
 
 public Long getId() {
  return id;
 }
 
 public void setId(Long id) {
  this.id = id;
 }
 
 public String getName() {
  return name;
 }
 
 public void setName(String name) {
  this.name = name;
 }
 
 public Integer getSalary() {
  return salary;
 }
 
 public void setSalary(Integer salary) {
  this.salary = salary;
 }
 
 public String getDepartment() {
  return department;
 }
 
 public void setDepartment(String department) {
  this.department = department;
 }
}

Шаг 5

Создать Rest Controller со всеми операциями.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package nl.blogspot.javasolutionsguide.springRestAndDataJpaWithSpringBoot.controller;
 
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import nl.blogspot.javasolutionsguide.springRestAndDataJpaWithSpringBoot.entity.Employee;
import nl.blogspot.javasolutionsguide.springRestAndDataJpaWithSpringBoot.service.EmployeeService;
 
/**
 * @author JavaSolutionsGuide
 *
 */
@RestController
public class EmployeeRestController {
  
 @Autowired
 private EmployeeService employeeService;
  
 public void setEmployeeService(EmployeeService employeeService) {
  this.employeeService = employeeService;
 }
 
 @GetMapping("/api/employees")
 public List<Employee> getEmployees() {
  List<Employee> employees = employeeService.retrieveEmployees();
  return employees;
 }
  
 @GetMapping("/api/employees/{employeeId}")
 public Employee getEmployee(@PathVariable(name="employeeId")Long employeeId) {
  return employeeService.getEmployee(employeeId);
 }
  
 @PostMapping("/api/employees")
 public void saveEmployee(Employee employee){
  employeeService.saveEmployee(employee);
  System.out.println("Employee Saved Successfully");
 }
  
 @DeleteMapping("/api/employees/{employeeId}")
 public void deleteEmployee(@PathVariable(name="employeeId")Long employeeId){
  employeeService.deleteEmployee(employeeId);
  System.out.println("Employee Deleted Successfully");
 }
  
 @PutMapping("/api/employees/{employeeId}")
 public void updateEmployee(@RequestBody Employee employee,
   @PathVariable(name="employeeId")Long employeeId){
  Employee emp = employeeService.getEmployee(employeeId);
  if(emp != null){
   employeeService.updateEmployee(employee);
  }
   
 }
 
}

Шаг 6

Создать сервисный интерфейс с методами, необходимыми для получения списка сотрудников, одного сотрудника, сохранения сотрудника в базе данных, удаления сотрудника и обновления и сотрудника.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
package nl.blogspot.javasolutionsguide.springRestAndDataJpaWithSpringBoot.service;
 
import java.util.List;
 
import nl.blogspot.javasolutionsguide.springRestAndDataJpaWithSpringBoot.entity.Employee;
 
/**
 * @author JavaSolutionsGuide
 *
 */
public interface EmployeeService {
 public List<Employee> retrieveEmployees();
  
 public Employee getEmployee(Long employeeId);
  
 public void saveEmployee(Employee employee);
  
 public void deleteEmployee(Long employeeId);
  
 public void updateEmployee(Employee employee);
}

Шаг 7

Создать класс реализации для интерфейса, созданного на шаге 6

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package nl.blogspot.javasolutionsguide.springRestAndDataJpaWithSpringBoot.service.impl;
 
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import nl.blogspot.javasolutionsguide.springRestAndDataJpaWithSpringBoot.entity.Employee;
import nl.blogspot.javasolutionsguide.springRestAndDataJpaWithSpringBoot.repository.EmployeeRepository;
import nl.blogspot.javasolutionsguide.springRestAndDataJpaWithSpringBoot.service.EmployeeService;
 
/**
 * @author JavaSolutionsGuide
 *
 */
@Service
public class EmployeeServiceImpl implements EmployeeService{
 
 @Autowired
 private EmployeeRepository employeeRepository;
 
 public void setEmployeeRepository(EmployeeRepository employeeRepository) {
  this.employeeRepository = employeeRepository;
 }
  
 public List<Employee> retrieveEmployees() {
  List<Employee> employees = employeeRepository.findAll();
  return employees;
 }
  
 public Employee getEmployee(Long employeeId) {
  Optional<Employee> optEmp = employeeRepository.findById(employeeId);
  return optEmp.get();
 }
  
 public void saveEmployee(Employee employee){
  employeeRepository.save(employee);
 }
  
 public void deleteEmployee(Long employeeId){
  employeeRepository.deleteById(employeeId);
 }
  
 public void updateEmployee(Employee employee) {
  employeeRepository.save(employee);
 }
}

Шаг 8

Создайте класс репозитория, который расширит данные JPA JpaRepository данных Spring и, следовательно, предоставит методы для выполнения операций CRUD из коробки.

01
02
03
04
05
06
07
08
09
10
11
package nl.blogspot.javasolutionsguide.springRestAndDataJpaWithSpringBoot.repository;
 
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
 
import nl.blogspot.javasolutionsguide.springRestAndDataJpaWithSpringBoot.entity.Employee;
 
@Repository
public interface EmployeeRepository extends JpaRepository<Employee,Long>{
 
}

Шаг 9

Включите веб-консоль базы данных H2, добавив следующие строки в файл application.properties

1
spring.h2.console.enabled=true
1
spring.h2.console.path=/h2

Spring Boot автоматически позаботится о создании источника данных для базы данных H2, однако мы можем также настроить источник данных в файле application.properties следующим образом:

1
spring.datasource.url=jdbc:h2:file:~/test
1
spring.datasource.username=sa
1
spring.datasource.password=spring.datasource.driver-class-name=org.h2.Driver

Шаг 10

С этим вы закончили создание своего API отдыха с помощью Spring Rest, JPA данных Spring с базой данных h2.

Теперь вам просто нужно запустить свой класс SpringRestAndDataJpaWithSpringBootApplication.java, и он удостоверится, что он соберет ваш код, упакует ваш код в jar и развернет его на встроенном сервере Tomcat.

Шаг 11

Откройте консоль базы данных H2, нажав следующий URL

1
http://localhost:8080/h2/

Он покажет вам следующий экран:

Restful API

Нажмите на кнопку Connect, и она соединит вас с базой данных H2. и вы можете видеть, что таблица EMPLOYEE была создана, но в этой таблице нет данных, как мы и ожидали.

Restful API

3. Использование Swagger для проверки конечных точек Restful

Чтобы проверить ваши конечные точки отдыха, нажмите на ссылку Swagger следующим образом:

1
http://localhost:8080/swagger-ui.html

Откроется следующая страница

Restful API

Нажмите на ссылку сотрудник-отдых-контроллер. Он покажет вам поддерживаемые операции этого контроллера следующим образом:

Restful API

Теперь мы можем видеть пять конечных точек на скриншоте выше. Мы проверим их один за другим.

Сохранить сотрудника — / API / сотрудников

Первое, что нам нужно сделать, это создать ресурс в базе данных. Для этого мы будем использовать операцию POST и использовать конечную точку / api / employee.

Restful API

Нажмите на saveEmployee и заполните все необходимые данные, которые нам нужны для создания ресурса, а затем нажмите кнопку «попробовать».

Restful API

Так будет выглядеть ваш запрос и ответ

Restful API

Как видите, код ответа — 200, что означает УСПЕХ, и, следовательно, наша запись должна была быть создана в базе данных H2.

Давайте проверим это.

Откройте веб-консоль H2 и выполните запрос к таблице EMPLOYEE, и вы увидите запись, которую мы добавили из Swagger UI.

Restful API

Аналогично, добавьте еще одного сотрудника из интерфейса Swagger со следующими данными:

Restful API

Снова запросите базу данных, и вы увидите две записи в базе данных следующим образом:

Restful API

Получить сотрудников — / API / сотрудников

Теперь, когда мы уже вставили две записи в базу данных, мы попытаемся извлечь эти записи с помощью операции GET и с использованием конечной точки / api / employee, как показано ниже:

Restful API

Нажмите на getEmployees, и тогда, когда мы хотим получить список всех сотрудников, нам не нужно передавать никаких параметров.

Restful API

Поэтому просто нажмите кнопку «попробовать», и в ответ вы получите список сотрудников.

Restful API

Получить Employee / api / employee / {employeeId}

Далее мы извлечем только одного сотрудника на основе ввода employeeId, используя операцию GET. Мы передадим employeeId в остальную конечную точку / api / employee / {employeeId}.

Restful API

Нажмите на getEmployee и заполните employeeId как 1, что означает, что мы хотим получить employee с employeeId 1.

Restful API

Нажмите на кнопку попробовать, и вы увидите данные о сотруднике с employeeId 1 в ответе:

Restful API

Обновить Employee — / api / employee / {employeeId}

Далее мы протестируем обновление конечной точки отдыха сотрудника, используя операцию PUT и используя / api / employee / {employeeId} конечную точку.

Restful API

Нажмите на ссылку updateEmployee. Вставьте одного из сотрудников json и поместите соответствующий employeeId следующим образом:

Restful API

Нажмите кнопку «Попробуйте», и вы увидите следующий ответ с кодом ответа 200 (УСПЕХ).

Restful API

Проверьте обновленную запись с обновленным окладом до 3000 из 1000 в таблице EMPLOYEE в базе данных H2 для сотрудника с employeeId 1.

Restful API

Удалить сотрудника — / api / employee / {employeeId}

Далее мы протестируем конечную точку удаления сотрудника, используя операцию DELETE, и будем использовать конечную точку / api / employee / {employeeId}.

Restful API

Нажмите на ссылку deteleEmployee и заполните employeeId 1, что означает, что мы хотим удалить employee с employeeId 1.

Restful API

Нажмите кнопку «попробовать», и вы получите код ответа 200, который означает, что запрос успешно обработан.

Restful API

Давайте проверим, был ли сотрудник с employeeId 1 успешно удален из базы данных, открыв консоль H2 и запросив базу данных.

Restful API

Как мы видим выше, у нас есть единственный сотрудник с employeeId 2 в таблице EMPLOYEE, следовательно, employee с employeeId 1 был успешно удален.

Резюме

Итак, в вышеприведенном посте мы увидели, как мы можем создать restful API, используя Spring rest, Spring Data JPA и базу данных H2 с Spring Boot.

Нам надо:

— Создайте проект Spring Boot из Spring Initializer с необходимыми зависимостями.

— Включите поддержку swagger, добавив дополнительные зависимости в POM.xml и добавив аннотацию в класс приложения весенней загрузки.

— Включите базу данных H2, добавив необходимые свойства в application.properties.

— Напишите Rest Controller, Service, репозиторий и сущность для работы.

— Запустите загрузочное приложение Spring, которое будет автоматически развернуто на встроенном сервере.

— Проверьте остальные конечные точки с помощью Swagger UI и проверьте данные в базе данных H2 с помощью консоли H2.

Спасибо за чтение. Поделитесь этим с кем-то, кто, по вашему мнению, может быть полезным.

Опубликовано на Java Code Geeks с разрешения Гаурава Бхардваджа, партнера нашей программы JCG . См. Оригинальную статью здесь: Restful API с использованием Spring Rest + Spring Data JPA + H2 с примером Spring Boot

Мнения, высказанные участниками Java Code Geeks, являются их собственными.