Пошаговое руководство по созданию вашей первой конечной точки в Spring

1. Создайте новый проект IntelliJ со следующими настройками:

Остальные настройки оставьте по умолчанию и нажмите «Готово».

2. Получите проект Gradle по умолчанию, настроенный для Java 11 и Spring-boot:

В этом руководстве используется Gradle 7, но Gradle 5.6x/6.3x и выше должен работать.

Прежде всего, нам нужно убедиться, что исходная и целевая совместимость нацелены на Java 11 в build.gradle. Вы будете искать это:

sourceCompatibility = 11
targetCompatibility = 11

Я бы рекомендовал использовать плагин spring-dependency-management, чтобы убедиться, что ваши включенные зависимости Spring не конфликтуют, что будет необходимо в больших проектах.

Весеннее управление зависимостями:

Плагин Gradle, который обеспечивает управление зависимостями и исключениями в стиле Maven.

Основываясь на настроенных метаданных управления зависимостями, подключаемый модуль управления зависимостями будет контролировать версии прямых и транзитивных зависимостей вашего проекта и учитывать любые исключения, объявленные в poms зависимостей вашего проекта.

Чтобы получить последнюю версию плагина spring-dependency-management, посетите https://plugins.gradle.org/plugin/io.spring.dependency-management.

Примером работающего build.gradle может быть:

plugins {
    id 'org.springframework.boot' version '2.4.5'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group 'com.demo.project'
version '1.0-SNAPSHOT'

sourceCompatibility = 11
targetCompatibility = 11

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

На момент написания статьи версия Gradle по умолчанию, упакованная с IntelliJ 2021.1, — 4.10.3, она устарела и приведет к сбоям сборки.

Чтобы протестировать свой дистрибутив Gradle, запустите gradlew -v (./gradlew -v на Mac/Linux) и просмотрите загруженную версию Gradle.

Если вам нужно обновить версию gradle, которую использует ваш проект IntelliJ, запустите

gradlew wrapper --gradle-version=7.0

или для пользователей Mac/Linux:

./gradlew wrapper --gradle-version=7.0

Соберите (gradlew build), и он должен быть успешно собран.

3. Добавьте исходный код приложения Spring:

  • Создайте пакет в src/main/java/ с именем com.demo.project для нашего приложения Spring.
  • Создайте класс во вновь созданном пакете с именем SpringDemoApplication.
package com.demo.project;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringDemoApplication.class, args);
    }

}

Вы должны иметь возможность запускать приложение Spring с помощью gradlew bootRun (./gradlew bootRun для пользователей Mac/Linux) в терминале. Если вы получаете недопустимую исходную ошибку, то ваш JAVA_HOME не указывает на ту же версию Java, на которую указывает ваш IntelliJ. Чтобы исправить это, либо измените переменную среды JAVA_HOME, чтобы она указывала на Java 11, либо используйте задачу bootRun в интерфейсе IntelliJ.

4. Добавьте конечную точку REST:

  • Создайте новый пакет с именем rest.
  • Создайте новый класс в rest с именем SpringDemoRestController.
package com.demo.project.rest;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SpringDemoRestController {

    @GetMapping("/demo")
    public ResponseEntity<String> helloWorld(@RequestParam(value = "name", defaultValue = "World") String name) {
        return ResponseEntity.ok(String.format("Hello %s!", name));
    }

}
  • Запустите приложение и перейдите к localhost:8080/demo и просмотрите результаты.
  • Также попробуйте localhost:8080/demo?name=friend и просмотрите свои результаты.

5. Напишите тесты приложения и контроллера:

  • В каталоге test/java создайте пакет com.demo.project, чтобы добавить тест приложения.
  • Создайте свой тест приложения:
package com.demo.project;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class SpringDemoApplicationTest {

    @Test
    public void contextLoads() {

    }

}

Этот тест очень прост и просто проверяет, загружается ли контекст приложения без ошибок или исключений.

  • Создайте еще один пакет rest внутри test/java/com/demo/project.
  • Создайте тесты контроллера отдыха:
package com.demo.project.rest;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

@SpringBootTest
public class SpringDemoRestControllerTest {

    @Autowired
    SpringDemoRestController controller;

    @Test
    public void getHelloWorld() {
        ResponseEntity<String> responseEntity = controller.helloWorld("World");

        Assertions.assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
        Assertions.assertEquals("Hello World!", responseEntity.getBody());
    }

    @Test
    public void getHelloWorldWithParam() {
        ResponseEntity<String> responseEntity = controller.helloWorld("friend");

        Assertions.assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
        Assertions.assertEquals("Hello friend!", responseEntity.getBody());
    }

}

Эти тесты подключаются к вашему контроллеру, чтобы обеспечить тестирование на уровне контроллера для утверждения соответствующих ответов и бизнес-логики. Чтобы запустить их, откройте терминал и в каталоге вашего проекта запустите gradlew build. Задача сборки выполняет все тесты.

На базовом уровне это то, как настроить веб-сервер Spring-boot с конечной точкой REST и тестами контроллера.