Статьи

Учебник по Spring: создание Hello World REST API с использованием Spring Framework и Spring Boot

Spring Framework был создан в результате разочарования сообщества Java более ранними версиями Enterprise Java. С тех пор она выросла в огромную экосистему, которая позволяет решить любую проблему при создании веб-приложения Java и многое другое. Spring часто критикуют за то, что он использовал XML для конфигурации. В ответ на это был выпущен фреймворк Spring Boot , который основывается на соглашении по принципу конфигурации и может вообще обходиться без XML.

В этой серии руководств мы рассмотрим, как создать приложение с использованием Spring Framework и Spring Boot. Хотя Spring Boot позволяет быстрее создавать приложения, Spring широко используется сегодня в корпоративной среде и даже стартапами, поэтому знание Spring, безусловно, является рыночным навыком, а также изучение его может дать представление о том, как работает Spring Boot. Код для простого приложения Spring Framework можно найти здесь, а версию Spring Boot здесь .

Создание веб-приложения Spring с использованием Maven Archetype

Для создания веб-приложения Spring можно использовать архетип maven-archetype-webapp . После этого необходимо добавить модули, относящиеся к Spring, в файл pom.xml . Один из способов — использовать так называемую спецификацию, которая позволяет не добавлять версию в зависимости. Файл pom.xml для нашего проекта показан ниже.

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
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.javaeeeee</groupId>
    <artifactId>SpringREST</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>SpringREST Maven Webapp</name>
    <url>http://maven.apache.org</url>
 
    <!-- Versions of artifacts-->
    <properties>
        <java.version>1.8</java.version>
        <spring.version>4.3.6.RELEASE</spring.version>
    </properties>
 
    <!-- Spring BOM -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-framework-bom</artifactId>
                <version>${spring.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
 
    <!-- Dependencies -->
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <finalName>SpringREST</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
 
</project>

Теперь, когда мы не добавили код в наше приложение, мы можем попытаться создать его и развернуть. Используемый нами архетип Maven создал файл index.jsp, расположенный в папке webapp / , который мы удалим позже, но сейчас мы будем использовать, чтобы узнать, как развернуть приложение на сервере приложений веб-профиля Tomcat 9. Для создания приложения можно использовать IDE или выполнить следующую команду из CLI.

1
<i>mvn clean package</i>

Независимо от того, как вы создали приложение, файл war создается в целевой / подпапке папки проекта.

Развертывание веб-приложения Spring в Tomcat

  Приложение может быть развернуто с помощью IDE или вручную, но перед этим необходимо загрузить Tomcat, если он не установлен в вашей системе, и настроить его. Процесс установки прост: необходимо разархивировать загруженный файл в какую-то папку и добавить путь к подпапке bin в переменную PATH в вашей системе. Кроме того, необходимо создать переменную среды CATALINA_HOME и указать для нее путь к папке установки Tomcat.

  Чтобы обеспечить доступ к веб-интерфейсу, необходимо добавить одну роль и одного пользователя в файл конфигурации tomcat-users.xml, расположенный в подпапке conf /, как показано ниже.

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
 
<tomcat-users xmlns="http://tomcat.apache.org/xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd">
     
    <role rolename="manager-gui"/>
    <user password="1" roles="manager-gui,manager-script,admin" username="admin"/>
</tomcat-users>

Это намного быстрее для развертывания приложения с помощью IDE, но здесь мы поговорим о том, как вручную развернуть приложение на Tomcat 9. Чтобы запустить сервер Tomcat, нужно набрать

catalina.bat запускается в Windows и catalina.sh запускается в Linux.

Чтобы убедиться, что сервер действительно запущен, перейдите к localhost: 8080, и должно появиться изображение, показанное ниже.

 

Чтобы остановить сервер, нужно ввести те же команды с остановкой вместо запуска .

  Самый простой способ вручную развернуть приложение в Tomcat — скопировать сгенерированный файл war , в нашем случае SpringREST.war , в подпапку webapps / папки установки Tomcat. После этого просто перейдите по адресу http: // localhost: 8080 / SpringREST / , где SpringREST — это имя приложения, и вы должны увидеть «Hello World!» Приветствие в вашем браузере. Другой способ развернуть приложение — использовать приложение Manager из вышеупомянутой веб-консоли Tomcat.

Добавление конфигурации, необходимой для запуска веб-приложения Spring

Теперь мы удалим файл index.jsp и создадим REST API, который вместо этого возвращает приветствие. Сначала нам нужно добавить сервлет-диспетчер в файл web.xml в подпапке WEB-INF / в подпапке webapp / . Файл web.xml показан ниже.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 
<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

Имя сервлета — dispatcher, и Spring будет искать файл с именем dispatcher-servlet.xml в той же подпапке для параметров конфигурации. Файл показан ниже и указывает Spring сканировать classpath в поисках контроллера REST, который обслуживает HTTP-запросы и возвращает приветствие.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15

Теперь мы готовы создать контроллер.

Добавление Hello World Spring MVC REST Controller

Код для контроллера показан ниже. Контроллер помечен аннотацией @RestController . Ранее мы указали Spring для сканирования определенных пакетов, чтобы найти классы, помеченные этой и некоторыми другими аннотациями, и использовать эти классы. Аннотация сообщает Spring, что этот класс будет обслуживать HTTP-запросы с использованием Spring MVC.

01
02
03
04
05
06
07
08
09
10
11
12
13
package com.javaeeeee.springrest.controllers;
 
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class HelloController {
 
    @GetMapping("/hello")
    public String getGreeting() {
        return "Hello Spring World!";
    }
}

Кроме того, есть аннотация @GetMapping, указывающая путь, по которому ресурс может быть достигнут. В нашем случае это означает, что можно получить приветствие с помощью localhost: 8080 / SpringREST / hello URL, используя метод HTTP GET. В более ранней версии Spring аннотация @RequestMapping использовалась для указания путей и методов HTTP, используемых для доступа к ресурсу.

Тестирование Spring MVC контроллеров

Код для простого теста для нашего контроллера показан ниже. В целях тестирования мы используем тот же файл конфигурации, но с именем test-dispatcher-servlet.xml и помещенный в папку src / test / resources / в папке нашего проекта.

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
package com.javaeeeee.springrest.controllers;
 
import org.junit.Test;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
 
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
 
@RunWith(SpringRunner.class)
@WebAppConfiguration
@ContextConfiguration("classpath:test-dispatcher-servlet.xml")
public class HelloControllerTest {
 
    @Autowired
    private WebApplicationContext webApplicationContext;
 
    private MockMvc mockMvc;
 
    @Before
    public void setUp() {
        this.mockMvc = MockMvcBuilders
                .webAppContextSetup(this.webApplicationContext)
                .build();
    }
 
    @Test
    public void testGetGreeting() throws Exception {
        this.mockMvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string("Hello Spring World!"));
    }
}

Тестовый класс украшен аннотацией @RunWith, которая инструктирует JUnit запускать наш тест с SpringRunner . Среда Spring MVC Test позволяет нам тестировать наш контроллер без контейнера сервлета. Внутри тестового метода мы делаем GET-запрос к нашему ресурсу и проверяем ответ.

Создание Hello World REST API с использованием Spring Boot

Для создания начального проекта Spring Boot мы будем использовать Spring Initializr, а затем откроем проект с помощью IDE. Мы набираем Web в поле ввода «Поиск зависимостей» и выбираем «Web», как показано на рисунке ниже, и нажимаем кнопку «Создать проект». Zip-файл загружается после этого.

Теперь мы должны добавить тот же контроллер REST в наш проект Spring Boot, который мы создали ранее. Проект можно построить с помощью той же команды, что и раньше, но результат по умолчанию упакован в файл jar и использует встроенный Tomcat, поэтому развертывание не требуется, но не забудьте остановить Tomcat перед запуском версии Spring Boot. Проект запускается с помощью следующей команды.

1
<i>java -jar target/SpringBootREST-0.0.1-SNAPSHOT.jar</i>

Приложение доступно по указанному ниже URL.

1
<i>localhost:8080/hello</i>

Что касается тестирования контроллера, код метода теста такой же, но аннотации к классу меняются; мы не используем конфигурацию XML для этого проекта. В следующем фрагменте показан тестовый класс для нашего контроллера.

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
package com.javaeeeee.controllers;
 
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
 
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {
    @Autowired
    private MockMvc mockMvc;
 
    @Test
    public void getGreeting() throws Exception {
        this.mockMvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string("Hello Spring World!"));
    }
 
}

Видно, что для воссоздания того же приложения с помощью Spring Boot требуется меньше шагов, так как инфраструктура многое выводит.

Резюме

В этой статье мы обсудили, как создать простой REST API Hello World с использованием Spring Framework и Spring Boot. Также мы обсудили, как тестировать код с помощью Spring MVC Test Framework. В то время как быстрее разрабатывать приложения с использованием Spring Boot и это определенно полезно для изучения того, что нет необходимости выполнять большую настройку, Spring Framework часто встречается в описаниях работы, и может быть полезно знать, как работает платформа под капотом.

Следует отметить, что веб-приложение может состоять из нескольких модулей, например, это может быть API REST, который предоставляет все функциональные возможности приложения, которые могут использоваться интерфейсом Angular или React, гибридным или собственным мобильным приложением или интерфейсом. Конечная часть написана на Spring, которая использует данные API REST и повторно публикует их с использованием HTML и некоторой структуры Java на основе шаблонов или компонентов. Создание мультимодульного приложения Maven может быть выполнено с использованием
П-корень
Архетип мавена.

Ресурсы:

  1. Spring Framework Справочная документация
  2. Документация по Apache Tomcat 9
  3. Полное руководство по запуску Tomcat
  4. Как установить Tomcat в Ubuntu
  5. Spring Boot Справочное руководство
  6. Сборка приложения с помощью Spring Boot
  7. Создание веб-службы RESTful