Spring Boot - Краткое руководство

Spring Boot - это среда на основе Java с открытым исходным кодом, используемая для создания микросервиса. Он разработан Pivotal Team и используется для создания автономных и готовых к производству приложений Spring. В этой главе вы познакомитесь с Spring Boot и его основными концепциями.

Что такое микросервис?

Микросервис - это архитектура, которая позволяет разработчикам самостоятельно разрабатывать и развертывать сервисы. Каждая запущенная служба имеет свой собственный процесс, что позволяет создать облегченную модель для поддержки бизнес-приложений.

Преимущества

Микросервисы предлагают своим разработчикам следующие преимущества:

  • Легкое развертывание
  • Простая масштабируемость
  • Совместимость с контейнерами
  • Минимальная конфигурация
  • Меньшее время производства

Что такое Spring Boot?

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

Преимущества

Spring Boot предлагает своим разработчикам следующие преимущества:

  • Легко понимать и разрабатывать приложения Spring
  • Повышает продуктивность
  • Сокращает время разработки

Цели

Spring Boot разработан для следующих целей -

  • Чтобы избежать сложной конфигурации XML в Spring
  • Упростить разработку готовых к производству приложений Spring
  • Чтобы сократить время разработки и запустить приложение самостоятельно
  • Предложите более простой способ начать работу с приложением

Почему именно Spring Boot?

Вы можете выбрать Spring Boot из-за функций и преимуществ, которые он предлагает, как указано здесь -

  • Он обеспечивает гибкий способ настройки компонентов Java, конфигураций XML и транзакций базы данных.

  • Он обеспечивает мощную пакетную обработку и управляет конечными точками REST.

  • В Spring Boot все настраивается автоматически; ручные настройки не требуются.

  • Он предлагает приложение Spring на основе аннотаций

  • Упрощает управление зависимостями

  • Включает встроенный контейнер сервлетов

Как это работает?

Spring Boot автоматически настраивает ваше приложение на основе зависимостей, которые вы добавили в проект, используя @EnableAutoConfigurationаннотация. Например, если база данных MySQL находится в вашем пути к классам, но вы не настроили какое-либо соединение с базой данных, то Spring Boot автоматически настраивает базу данных в памяти.

Точкой входа в приложение загрузки Spring является класс, содержащий @SpringBootApplication аннотация и основной метод.

Spring Boot автоматически сканирует все компоненты, включенные в проект, используя @ComponentScan аннотация.

Spring Boot Starters

Управление зависимостями - сложная задача для больших проектов. Spring Boot решает эту проблему, предоставляя набор зависимостей для удобства разработчиков.

Например, если вы хотите использовать Spring и JPA для доступа к базе данных, достаточно включить spring-boot-starter-data-jpa зависимость в вашем проекте.

Обратите внимание, что все стартеры Spring Boot следуют одному и тому же шаблону именования. spring-boot-starter- *, где * означает, что это тип приложения.

Примеры

Посмотрите на следующие стартеры Spring Boot, объясненные ниже, для лучшего понимания -

Spring Boot Starter Actuator dependencyиспользуется для мониторинга и управления вашим приложением. Его код показан ниже -

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Spring Boot Starter Security dependencyиспользуется для Spring Security. Его код показан ниже -

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Spring Boot Starter web dependencyиспользуется для записи конечных точек отдыха. Его код показан ниже -

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Spring Boot Starter Thyme Leaf dependencyиспользуется для создания веб-приложения. Его код показан ниже -

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Spring Boot Starter Test dependencyиспользуется для написания тестовых случаев. Его код показан ниже -

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
</dependency>

Автоматическая конфигурация

Spring Boot Auto Configuration автоматически настраивает ваше приложение Spring на основе зависимостей JAR, которые вы добавили в проект. Например, если база данных MySQL находится на вашем пути к классу, но вы не настроили подключение к базе данных, то Spring Boot автоматически настраивает базу данных в памяти.

Для этого вам нужно добавить @EnableAutoConfiguration аннотация или @SpringBootApplicationаннотация к вашему основному файлу класса. Затем ваше приложение Spring Boot будет автоматически настроено.

Обратите внимание на следующий код для лучшего понимания -

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

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

Приложение Spring Boot

Точкой входа Spring Boot Application является класс, содержащий @SpringBootApplicationаннотация. Этот класс должен иметь основной метод для запуска приложения Spring Boot.@SpringBootApplication аннотация включает автоконфигурацию, сканирование компонентов и конфигурацию загрузки Spring.

Если вы добавили @SpringBootApplication аннотации к классу, вам не нужно добавлять @EnableAutoConfiguration, @ComponentScan и @SpringBootConfigurationаннотация. В@SpringBootApplication аннотация включает все остальные аннотации.

Обратите внимание на следующий код для лучшего понимания -

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

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

Компонент Сканирование

Приложение Spring Boot сканирует все бины и объявления пакетов при инициализации приложения. Вам нужно добавить@ComponentScan аннотация для вашего файла класса для сканирования ваших компонентов, добавленных в ваш проект.

Обратите внимание на следующий код для лучшего понимания -

import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;

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

В этой главе вы узнаете, как создать приложение Spring Boot с помощью Maven и Gradle.

Предпосылки

Ваша система должна иметь следующие минимальные требования для создания приложения Spring Boot:

  • Java 7
  • Maven 3.2
  • Gradle 2.5

Spring Boot CLI

Spring Boot CLI - это инструмент командной строки, который позволяет нам запускать скрипты Groovy. Это самый простой способ создать приложение Spring Boot с помощью интерфейса командной строки Spring Boot. Вы можете создавать, запускать и тестировать приложение в самой командной строке.

В этом разделе объясняются шаги, необходимые для ручной установки Spring Boot CLI. Для получения дополнительной помощи вы можете использовать следующую ссылку:https://docs.spring.io/springboot/ docs/current-SNAPSHOT/reference/htmlsingle/#getting-started-installing-springboot

Вы также можете загрузить дистрибутив Spring CLI из репозитория Spring Software по адресу: https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#getting-started-manual-cli-installation

Для ручной установки вам необходимо использовать следующие две папки -

  • spring-boot-cli-2.0.0.BUILD-SNAPSHOT-bin.zip

  • spring-boot-cli-2.0.0.BUILD-SNAPSHOT-bin.tar.gz

После загрузки распакуйте архивный файл и следуйте инструкциям в файле install.txt. Не то чтобы это не требует настройки среды.

В Windows перейдите в интерфейс командной строки Spring Boot bin каталог в командной строке и запустите команду spring –-versionчтобы убедиться, что Spring CLI установлен правильно. После выполнения команды вы можете увидеть версию Spring CLI, как показано ниже -

Запускаем Hello World с Groovy

Создайте простой файл groovy, который содержит сценарий Rest Endpoint, и запустите файл groovy с помощью интерфейса командной строки Spring boot. Обратите внимание на код, показанный здесь для этой цели -

@Controller
class Example {
   @RequestMapping("/")
   @ResponseBody
   public String hello() {
      "Hello Spring Boot"
   }
}

Теперь сохраните файл groovy с именем hello.groovy. Обратите внимание, что в этом примере мы сохранили файл groovy внутри Spring Boot CLI.binкаталог. Теперь запустите приложение с помощью командыspring run hello.groovy как показано на скриншоте ниже -

После того, как вы запустите файл groovy, необходимые зависимости загрузятся автоматически, и он запустит приложение в порту Tomcat 8080, как показано на скриншоте ниже -

После запуска Tomcat перейдите в веб-браузер и нажмите URL-адрес http://localhost:8080/ и вы можете увидеть результат, как показано.

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

Инициализатор Spring

Одним из способов начальной загрузки приложения Spring Boot является использование Spring Initializer. Для этого вам нужно будет посетить веб-страницу Spring Initializer www.start.spring.io и выбрать сборку, версию Spring Boot и платформу. Кроме того, вам необходимо предоставить группу, артефакт и необходимые зависимости для запуска приложения.

Обратите внимание на следующий снимок экрана, который показывает пример, в котором мы добавили spring-boot-starter-web зависимость для записи конечных точек REST.

После того, как вы указали группу, артефакт, зависимости, проект сборки, платформу и версию, нажмите Generate Projectкнопка. ZIP-файл будет загружен, и файлы будут извлечены.

В этом разделе объясняются примеры с использованием как Maven, так и Gradle.

Maven

После загрузки проекта разархивируйте файл. Теперь твойpom.xml файл выглядит как показано ниже -

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>demo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.8.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-web</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>
   
   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Gradle

После загрузки проекта разархивируйте файл. Теперь твойbuild.gradle файл выглядит как показано ниже -

buildscript {
   ext {
      springBootVersion = '1.5.8.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

Зависимости пути к классу

Spring Boot предоставляет ряд Startersчтобы добавить банки в наш путь к классам. Например, для написания конечной точки отдыха нам нужно добавитьspring-boot-starter-webзависимость в нашем пути к классам. Обратите внимание на коды, показанные ниже, для лучшего понимания -

Зависимость от Maven

<dependencies>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
</dependencies>

Зависимость от Gradle

dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
}

Основной метод

Основным методом должно быть написание класса Spring Boot Application. Этот класс должен быть аннотирован@SpringBootApplication. Это точка входа для запуска приложения весенней загрузки. Вы можете найти основной файл класса вsrc/java/main каталоги с пакетом по умолчанию.

В этом примере главный файл класса расположен в src/java/main каталоги с пакетом по умолчанию com.tutorialspoint.demo. Обратите внимание на код, показанный здесь, для лучшего понимания -

package com.tutorialspoint.demo;

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

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

Написать конечную точку отдыха

Чтобы написать простую конечную точку Hello World Rest в самом файле основного класса Spring Boot Application, выполните следующие действия:

  • Во-первых, добавьте @RestController аннотация вверху класса.

  • Теперь напишите метод Request URI с @RequestMapping аннотация.

  • Затем метод Request URI должен вернуть Hello World строка.

Теперь ваш основной файл класса Spring Boot Application будет выглядеть так, как показано в приведенном ниже коде -

package com.tutorialspoint.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController

public class DemoApplication {
   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
   @RequestMapping(value = "/")
   public String hello() {
      return "Hello World";
   }
}

Создать исполняемый файл JAR

Давайте создадим исполняемый файл JAR для запуска приложения Spring Boot с помощью команд Maven и Gradle в командной строке, как показано ниже -

Используйте команду Maven mvn clean install, как показано ниже -

После выполнения команды вы можете увидеть BUILD SUCCESS сообщение в командной строке, как показано ниже -

Используйте команду Gradle gradle clean build как показано ниже -

После выполнения команды вы можете увидеть BUILD SUCCESSFUL сообщение в командной строке, как показано ниже -

Запускаем Hello World с Java

После того, как вы создали исполняемый файл JAR, вы можете найти его в следующих каталогах.

Для Maven вы можете найти файл JAR в целевом каталоге, как показано ниже -

Для Gradle вы можете найти файл JAR под build/libs каталог, как показано ниже -

Теперь запустите файл JAR с помощью команды java –jar <JARFILE>. Обратите внимание, что в приведенном выше примере файл JAR называетсяdemo-0.0.1-SNAPSHOT.jar

После запуска файла jar вы можете увидеть вывод в окне консоли, как показано ниже -

Теперь посмотрите на консоль, Tomcat запустился через порт 8080 (http). Теперь перейдите в веб-браузер и нажмите URL-адресhttp://localhost:8080/ и вы можете увидеть результат, как показано ниже -

Используя приложение Spring Boot, мы можем создать военный файл для развертывания на веб-сервере. В этой главе вы узнаете, как создать файл WAR и развернуть приложение Spring Boot на веб-сервере Tomcat.

Инициализатор сервлета Spring Boot

Традиционный способ развертывания - сделать приложение Spring Boot Application @SpringBootApplication класс расширить SpringBootServletInitializerкласс. Файл класса Spring Boot Servlet Initializer позволяет настраивать приложение при его запуске с помощью контейнера сервлетов.

Код для файла класса Spring Boot Application для развертывания файла JAR приведен ниже -

package com.tutorialspoint.demo;

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

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

Нам нужно расширить класс SpringBootServletInitializerдля поддержки развертывания файлов WAR. Код файла класса Spring Boot Application приведен ниже -

package com.tutorialspoint.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class DemoApplication  extends SpringBootServletInitializer {
   @Override
   protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
      return application.sources(DemoApplication.class);
   }
   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
}

Установка основного класса

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

Для Maven добавьте начальный класс в pom.xml свойства, как показано ниже -

<start-class>com.tutorialspoint.demo.DemoApplication</start-class>

Для Gradle добавьте имя основного класса в build.gradle, как показано ниже -

mainClassName="com.tutorialspoint.demo.DemoApplication"

Обновить упаковку JAR в WAR

Мы должны обновить упаковку JAR в WAR, используя следующие фрагменты кода:

Для Maven добавьте упаковку как WAR в pom.xml как показано ниже -

<packaging>war</packaging>

Для Gradle добавьте плагин приложения и плагин войны в build.gradle как показано ниже -

apply plugin: ‘war’
apply plugin: ‘application’

Теперь давайте напишем простую конечную точку отдыха, чтобы возвращать строку «Hello World from Tomcat». Чтобы написать конечную точку отдыха, нам нужно добавить зависимость веб-стартера Spring Boot в наш файл сборки.

Для Maven добавьте начальную зависимость Spring Boot в pom.xml, используя код, как показано ниже -

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Для Gradle добавьте начальную зависимость Spring Boot в build.gradle используя код, как показано ниже -

dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
}

Теперь напишите простую конечную точку отдыха в файле класса Spring Boot Application, используя код, как показано ниже -

package com.tutorialspoint.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication  extends SpringBootServletInitializer {
   @Override
   protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
      return application.sources(DemoApplication.class);
   }
   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
   
   @RequestMapping(value = "/")
   public String hello() {
      return "Hello World from Tomcat";
   }
}

Упаковка вашего приложения

Теперь создайте файл WAR для развертывания на сервере Tomcat с помощью команд Maven и Gradle для упаковки вашего приложения, как указано ниже -

Для Maven используйте команду mvn packageдля упаковки вашего приложения. Затем будет создан файл WAR, и вы сможете найти его в целевом каталоге, как показано на скриншотах, приведенных ниже -

Для Gradle используйте команду gradle clean buildдля упаковки вашего приложения. Затем ваш файл WAR будет создан, и вы сможете найти его вbuild/libsкаталог. Обратите внимание на приведенные здесь скриншоты для лучшего понимания -

Развернуть в Tomcat

Теперь запустите Tomcat Server и разверните WAR-файл под webappsкаталог. Обратите внимание на приведенные здесь скриншоты для лучшего понимания -

После успешного развертывания нажмите URL-адрес в своем веб-браузере. http://localhost:8080/demo-0.0.1-SNAPSHOT/ и обратите внимание, что результат будет выглядеть, как показано на скриншоте ниже -

Полный код для этой цели приведен ниже.

pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

   <groupId>com.tutorialspoint</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>war</packaging>
   <name>demo</name>
   <description>Demo project for Spring Boot</description>
   
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.8.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>
      <start-class>com.tutorialspoint.demo.DemoApplication</start-class>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.8.RELEASE'
   }
   repositories {
      mavenCentral()
   }
dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'war'
apply plugin: 'application'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
mainClassName = "com.tutorialspoint.demo.DemoApplication"

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

Код для основного файла класса приложения Spring Boot приведен ниже -

package com.tutorialspoint.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication  extends SpringBootServletInitializer {
   @Override
   protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
      return application.sources(DemoApplication.class);
   }
   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
   
   @RequestMapping(value = "/")
   public String hello() {
      return "Hello World from Tomcat";
   }
}

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

Управление зависимостями

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

Note- Если вы хотите указать версию для зависимости, вы можете указать ее в своем файле конфигурации. Однако команда Spring Boot настоятельно рекомендует не указывать версию для зависимости.

Зависимость от Maven

Для конфигурации Maven мы должны унаследовать родительский проект Spring Boot Starter для управления зависимостями Spring Boot Starters. Для этого мы можем просто унаследовать стартового родителя в нашемpom.xml файл, как показано ниже.

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>1.5.8.RELEASE</version>
</parent>

Мы должны указать номер версии для зависимости Spring Boot Parent Starter. Тогда для других начальных зависимостей нам не нужно указывать номер версии Spring Boot. Соблюдайте код, приведенный ниже -

<dependencies>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
</dependencies>

Зависимость Gradle

Мы можем импортировать зависимости Spring Boot Starters прямо в build.gradleфайл. Нам не нужна родительская зависимость Spring Boot start, такая как Maven для Gradle. Соблюдайте код, приведенный ниже -

buildscript {
   ext {
      springBootVersion = '1.5.8.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

Точно так же в Gradle нам не нужно указывать номер версии Spring Boot для зависимостей. Spring Boot автоматически настраивает зависимость в зависимости от версии.

dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
}

Spring Boot не имеет макета кода для работы. Однако есть несколько передовых практик, которые нам помогут. В этой главе о них рассказывается подробно.

Пакет по умолчанию

Класс, не имеющий объявления пакета, считается default package. Обратите внимание, что обычно объявление пакета по умолчанию не рекомендуется. Spring Boot вызовет такие проблемы, как сбой автоматической конфигурации или сканирования компонентов, если вы используете пакет по умолчанию.

Note- Рекомендуемое Java соглашение об именах для объявления пакетов - это обратное доменное имя. Например -com.tutorialspoint.myproject

Типовая планировка

Типичный макет приложения Spring Boot показан на изображении, приведенном ниже -

В файле Application.java должен быть объявлен основной метод вместе с @SpringBootApplication. Обратите внимание на код, приведенный ниже, для лучшего понимания -

package com.tutorialspoint.myproject;

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

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

В Spring Boot мы можем использовать Spring Framework для определения наших bean-компонентов и их внедрения зависимостей. В@ComponentScan аннотация используется для поиска beans и соответствующего введенного с @Autowired аннотация.

Если вы следовали типичному макету Spring Boot, указывать аргументы для @ComponentScanаннотация. Все файлы классов компонентов автоматически регистрируются в Spring Beans.

Следующий пример дает представление об автоматическом подключении объекта Rest Template и создании для него Bean-компонента:

@Bean
public RestTemplate getRestTemplate() {
   return new RestTemplate();
}

Следующий код показывает код для автоматически подключенного объекта Rest Template и объекта создания Bean в основном файле класса Spring Boot Application.

package com.tutorialspoint.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class DemoApplication {
@Autowired
   RestTemplate restTemplate;
   
   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
   @Bean
   public RestTemplate getRestTemplate() {
      return new RestTemplate();   
   }
}

Интерфейсы Application Runner и Command Line Runner позволяют выполнять код после запуска приложения Spring Boot. Вы можете использовать эти интерфейсы для выполнения любых действий сразу после запуска приложения. В этой главе о них рассказывается подробно.

Средство выполнения приложений

Application Runner - это интерфейс, используемый для выполнения кода после запуска приложения Spring Boot. В приведенном ниже примере показано, как реализовать интерфейс Application Runner в основном файле класса.

package com.tutorialspoint.demo;

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

@SpringBootApplication
public class DemoApplication implements ApplicationRunner {
   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
   @Override
   public void run(ApplicationArguments arg0) throws Exception {
      System.out.println("Hello World from Application Runner");
   }
}

Теперь, если вы посмотрите на окно консоли ниже Hello World from Application Runner, инструкция println выполняется после запуска Tomcat. Актуален ли следующий скриншот?

Командная строка Runner

Command Line Runner - это интерфейс. Он используется для выполнения кода после запуска приложения Spring Boot. В приведенном ниже примере показано, как реализовать интерфейс командной строки Runner в основном файле класса.

package com.tutorialspoint.demo;

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

@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
   @Override
   public void run(String... arg0) throws Exception {
      System.out.println("Hello world from Command Line Runner");
   }
}

Посмотрите на окно консоли под «Hello world from Command Line Runner». Оператор println выполняется после запуска Tomcat.

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

Свойства командной строки

Приложение Spring Boot преобразует свойства командной строки в свойства среды Spring Boot Environment. Свойства командной строки имеют приоритет над другими источниками свойств. По умолчанию Spring Boot использует номер порта 8080 для запуска Tomcat. Давайте узнаем, как изменить номер порта с помощью свойств командной строки.

Step 1 - После создания исполняемого файла JAR запустите его с помощью команды java –jar <JARFILE>.

Step 2 - Используйте команду, приведенную на скриншоте ниже, чтобы изменить номер порта для приложения Spring Boot с помощью свойств командной строки.

Note - Вы можете указать несколько свойств приложения, используя разделитель -.

Файл свойств

Файлы свойств используются для хранения N свойств в одном файле для запуска приложения в другой среде. В Spring Boot свойства хранятся вapplication.properties файл в пути к классам.

Файл application.properties находится в папке src/main/resourcesкаталог. Код для образцаapplication.properties файл приведен ниже -

server.port = 9090
spring.application.name = demoservice

Обратите внимание, что в приведенном выше коде демосервис приложения Spring Boot запускается на порту 9090.

YAML файл

Spring Boot поддерживает конфигурации свойств на основе YAML для запуска приложения. Вместоapplication.properties, мы можем использовать application.ymlфайл. Этот файл YAML также должен храниться в пути к классам. Образецapplication.yml файл приведен ниже -

spring:
   application:
      name: demoservice
   server:
port: 9090

Внешние свойства

Вместо того, чтобы хранить файл свойств в пути к классам, мы можем сохранить свойства в другом месте или другом пути. При запуске файла JAR мы можем указать путь к файлу свойств. Вы можете использовать следующую команду, чтобы указать местоположение файла свойств при запуске JAR -

-Dspring.config.location = C:\application.properties

Использование аннотации @Value

Аннотация @Value используется для чтения значения свойства среды или приложения в коде Java. Синтаксис для чтения значения свойства показан ниже -

@Value("${property_key_name}")

Посмотрите на следующий пример, который показывает синтаксис для чтения spring.application.name значение свойства в переменной Java с помощью аннотации @Value.

@Value("${spring.application.name}")

Обратите внимание на код, приведенный ниже, для лучшего понимания -

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {
   @Value("${spring.application.name}")
   private String name;
   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
   @RequestMapping(value = "/")
   public String name() {
      return name;
   }
}

Note - Если свойство не найдено во время работы приложения, Spring Boot выдает исключение Illegal Argument как Could not resolve placeholder 'spring.application.name' in value "${spring.application.name}".

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

@Value("${property_key_name:default_value}")

@Value("${spring.application.name:demoservice}")

Активный профиль Spring Boot

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

Активный профиль Spring в application.properties

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

application.properties

server.port = 8080
spring.application.name = demoservice

application-dev.properties

server.port = 9090
spring.application.name = demoservice

application-prod.properties

server.port = 4431
spring.application.name = demoservice

При запуске файла JAR нам необходимо указать активный профиль пружины на основе каждого файла свойств. По умолчанию приложение Spring Boot использует файл application.properties. Команда для установки активного профиля пружины показана ниже -

Вы можете увидеть имя активного профиля в журнале консоли, как показано ниже -

2017-11-26 08:13:16.322  INFO 14028 --- [           
   main] com.tutorialspoint.demo.DemoApplication  :
   The following profiles are active: dev

Теперь Tomcat запущен на порту 9090 (http), как показано ниже -

2017-11-26 08:13:20.185  INFO 14028 --- [           
   main] s.b.c.e.t.TomcatEmbeddedServletContainer : 
   Tomcat started on port(s): 9090 (http)

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

Вы можете увидеть имя активного профиля в журнале консоли, как показано ниже -

2017-11-26 08:13:16.322  INFO 14028 --- [           
   main] com.tutorialspoint.demo.DemoApplication  :
   The following profiles are active: prod

Теперь Tomcat запустился на порту 4431 (http), как показано ниже -

2017-11-26 08:13:20.185  INFO 14028 --- [          
   main] s.b.c.e.t.TomcatEmbeddedServletContainer :
   Tomcat started on port(s): 4431 (http)

Активный профиль Spring для application.yml

Давайте разберемся, как сохранить активный профиль Spring для application.yml. Мы можем сохранить свойства активного профиля Spring в единственномapplication.ymlфайл. Нет необходимости использовать отдельный файл, например application.properties.

Ниже приведен пример кода для сохранения активных профилей Spring в файле application.yml. Обратите внимание, что разделитель (---) используется для разделения каждого профиля в файле application.yml.

spring:
   application:
      name: demoservice
server:
   port: 8080

---
spring:
   profiles: dev
   application:
      name: demoservice
server:
   port: 9090

---
spring: 
   profiles: prod
   application:
      name: demoservice
server: 
   port: 4431

Команда для установки активного профиля разработки приведена ниже -

Вы можете увидеть имя активного профиля в журнале консоли, как показано ниже -

2017-11-26 08:41:37.202  INFO 14104 --- [           
   main] com.tutorialspoint.demo.DemoApplication  : 
   The following profiles are active: dev

Теперь Tomcat запустился на порту 9090 (http), как показано ниже -

2017-11-26 08:41:46.650  INFO 14104 --- [           
   main] s.b.c.e.t.TomcatEmbeddedServletContainer : 
   Tomcat started on port(s): 9090 (http)

Команда для установки активного профиля производства приведена ниже -

Вы можете увидеть имя активного профиля в журнале консоли, как показано ниже -

2017-11-26 08:43:10.743  INFO 13400 --- [    
   main] com.tutorialspoint.demo.DemoApplication  : 
   The following profiles are active: prod

Это запустит Tomcat на порту 4431 (http), как показано ниже:

2017-11-26 08:43:14.473  INFO 13400 --- [     
   main] s.b.c.e.t.TomcatEmbeddedServletContainer : 
   Tomcat started on port(s): 4431 (http)

Spring Boot использует ведение журнала Apache Commons для всех внутренних журналов. Конфигурации Spring Boot по умолчанию обеспечивают поддержку использования Java Util Logging, Log4j2 и Logback. Используя их, мы можем настроить ведение журнала консоли, а также ведение журнала файлов.

Если вы используете Spring Boot Starters, Logback обеспечит хорошую поддержку для ведения журнала. Кроме того, Logback также обеспечивает хорошую поддержку для Common Logging, Util Logging, Log4J и SLF4J.

Формат журнала

Формат журнала загрузки Spring по умолчанию показан на скриншоте ниже.

который дает вам следующую информацию -

  • Date и Time который дает дату и время журнала

  • Log level показывает ИНФОРМАЦИЮ, ОШИБКУ или ПРЕДУПРЕЖДЕНИЕ

  • Process ID

  • ---, который является разделителем

  • Thread name заключен в квадратные скобки []

  • Logger Name который показывает имя исходного класса

  • Сообщение журнала

Вывод журнала консоли

Сообщения журнала по умолчанию будут распечатаны в окне консоли. По умолчанию сообщения журнала «INFO», «ERROR» и «WARN» печатаются в файле журнала.

Если вам нужно включить журнал уровня отладки, добавьте флаг отладки при запуске приложения, используя команду, показанную ниже -

java –jar demo.jar --debug

Вы также можете добавить режим отладки в свой файл application.properties, как показано здесь -

debug = true

Вывод журнала в файл

По умолчанию все журналы печатаются в окне консоли, а не в файлах. Если вы хотите распечатать журналы в файле, вам необходимо установить свойствоlogging.file или же logging.path в файле application.properties.

Вы можете указать путь к файлу журнала, используя свойство, показанное ниже. Обратите внимание, что имя файла журнала - spring.log.

logging.path = /var/tmp/

Вы можете указать собственное имя файла журнала, используя свойство, показанное ниже -

logging.file = /var/tmp/mylog.log

Note - файлы будут вращаться автоматически после достижения размера 10 МБ.

Уровни журнала

Spring Boot поддерживает все уровни регистратора, такие как «TRACE», «DEBUG», «INFO», «WARN», «ERROR», «FATAL», «OFF». Вы можете определить Root logger в файле application.properties, как показано ниже -

logging.level.root = WARN

Note- Logback не поддерживает журнал уровня «FATAL». Он отображается в журнал уровня «ERROR».

Настроить возврат

Logback поддерживает конфигурацию на основе XML для обработки конфигураций журнала загрузки Spring. Детали конфигурации регистрации настраиваются вlogback.xmlфайл. Файл logback.xml следует поместить в путь к классам.

Вы можете настроить журнал уровня ROOT в файле Logback.xml, используя код, приведенный ниже -

<?xml version = "1.0" encoding = "UTF-8"?>
<configuration>
   <root level = "INFO">
   </root>
</configuration>

Вы можете настроить консольное приложение в файле Logback.xml, указанном ниже.

<?xml version = "1.0" encoding = "UTF-8"?>
<configuration>
   <appender name = "STDOUT" class = "ch.qos.logback.core.ConsoleAppender"></appender>
   <root level = "INFO">
      <appender-ref ref = "STDOUT"/> 
   </root>
</configuration>

Вы можете настроить приложение для файлов в файле Logback.xml, используя приведенный ниже код. Обратите внимание, что вам необходимо указать путь к файлу журнала внутри приложения для файлов.

<?xml version = "1.0" encoding = "UTF-8"?>
<configuration>
   <appender name = "FILE" class = "ch.qos.logback.core.FileAppender">
      <File>/var/tmp/mylog.log</File>
   </appender>   
   <root level = "INFO">
      <appender-ref ref = "FILE"/>
   </root>
</configuration>

Вы можете определить шаблон журнала в logback.xmlфайл, используя код, приведенный ниже. Вы также можете определить набор поддерживаемых шаблонов журнала внутри консоли или приложения журнала файлов, используя приведенный ниже код:

<pattern>[%d{yyyy-MM-dd'T'HH:mm:ss.sss'Z'}] [%C] [%t] [%L] [%-5p] %m%n</pattern>

Код для полного файла logback.xml приведен ниже. Вы должны поместить это в путь класса.

<?xml version = "1.0" encoding = "UTF-8"?>
<configuration>
   <appender name = "STDOUT" class = "ch.qos.logback.core.ConsoleAppender">
      <encoder>
         <pattern>[%d{yyyy-MM-dd'T'HH:mm:ss.sss'Z'}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
      </encoder>
   </appender>
   
   <appender name = "FILE" class = "ch.qos.logback.core.FileAppender">
      <File>/var/tmp/mylog.log</File>
      <encoder>
         <pattern>[%d{yyyy-MM-dd'T'HH:mm:ss.sss'Z'}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
      </encoder>
   </appender>
   
   <root level = "INFO">
      <appender-ref ref = "FILE"/>
      <appender-ref ref = "STDOUT"/> 
   </root>
</configuration>

Приведенный ниже код показывает, как добавить регистратор slf4j в файл основного класса Spring Boot.

package com.tutorialspoint.demo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {
   private static final Logger logger = LoggerFactory.getLogger(DemoApplication.class);
   
   public static void main(String[] args) {
      logger.info("this is a info message");
      logger.warn("this is a warn message");
      logger.error("this is a error message");
      SpringApplication.run(DemoApplication.class, args);
   }
}

Вывод, который вы можете увидеть в окне консоли, показан здесь -

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

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

Note - Для создания веб-служб RESTful нам необходимо добавить веб-зависимость Spring Boot Starter в файл конфигурации сборки.

Если вы являетесь пользователем Maven, используйте следующий код, чтобы добавить указанную ниже зависимость в свой pom.xml файл -

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>    
</dependency>

Если вы являетесь пользователем Gradle, используйте следующий код, чтобы добавить указанную ниже зависимость в свой build.gradle файл.

compile('org.springframework.boot:spring-boot-starter-web')

Код для полного файла конфигурации сборки Maven build – pom.xml приведено ниже -

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>demo</name>
   <description>Demo project for Spring Boot</description>
   
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.8.RELEASE</version>
      <relativePath/> 
   </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-web</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>
   
   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Код для полного файла конфигурации сборки Gradle Build – build.gradle приведено ниже -

buildscript {
   ext {
      springBootVersion = '1.5.8.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

Прежде чем приступить к созданию веб-службы RESTful, рекомендуется ознакомиться со следующими аннотациями:

Регулятор отдыха

Аннотация @RestController используется для определения веб-служб RESTful. Он обслуживает JSON, XML и настраиваемый ответ. Его синтаксис показан ниже -

@RestController
public class ProductServiceController { 
}

Запросить сопоставление

Аннотация @RequestMapping используется для определения URI запроса для доступа к конечным точкам REST. Мы можем определить метод запроса для потребления и создания объекта. Метод запроса по умолчанию - GET.

@RequestMapping(value = "/products")
public ResponseEntity<Object> getProducts() { }

Тело запроса

Аннотация @RequestBody используется для определения типа содержимого тела запроса.

public ResponseEntity<Object> createProduct(@RequestBody Product product) {
}

Переменная пути

Аннотация @PathVariable используется для определения пользовательского или динамического URI запроса. Переменная Path в URI запроса определяется как фигурные скобки {}, как показано ниже -

public ResponseEntity<Object> updateProduct(@PathVariable("id") String id) {
}

Параметр запроса

Аннотация @RequestParam используется для чтения параметров запроса из URL-адреса запроса. По умолчанию это обязательный параметр. Мы также можем установить значение по умолчанию для параметров запроса, как показано здесь -

public ResponseEntity<Object> getProduct(
   @RequestParam(value = "name", required = false, defaultValue = "honey") String name) {
}

ПОЛУЧИТЬ API

Метод HTTP-запроса по умолчанию - GET. Этот метод не требует тела запроса. Вы можете отправить параметры запроса и переменные пути для определения пользовательского или динамического URL-адреса.

Пример кода для определения метода запроса HTTP GET показан ниже. В этом примере мы использовали HashMap для хранения продукта. Обратите внимание, что мы использовали класс POJO в качестве продукта для хранения.

Здесь URI запроса /productsи он вернет список продуктов из репозитория HashMap. Ниже приведен файл класса контроллера, который содержит конечную точку REST GET.

package com.tutorialspoint.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.tutorialspoint.demo.model.Product;

@RestController
public class ProductServiceController {
   private static Map<String, Product> productRepo = new HashMap<>();
   static {
      Product honey = new Product();
      honey.setId("1");
      honey.setName("Honey");
      productRepo.put(honey.getId(), honey);
      
      Product almond = new Product();
      almond.setId("2");
      almond.setName("Almond");
      productRepo.put(almond.getId(), almond);
   }
   @RequestMapping(value = "/products")
   public ResponseEntity<Object> getProduct() {
      return new ResponseEntity<>(productRepo.values(), HttpStatus.OK);
   }
}

POST API

Запрос HTTP POST используется для создания ресурса. Этот метод содержит тело запроса. Мы можем отправлять параметры запроса и переменные пути для определения настраиваемого или динамического URL.

В следующем примере показан пример кода для определения метода запроса HTTP POST. В этом примере мы использовали HashMap для хранения продукта, где продукт является классом POJO.

Здесь URI запроса /products, и он вернет String после сохранения продукта в репозитории HashMap.

package com.tutorialspoint.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.tutorialspoint.demo.model.Product;

@RestController
public class ProductServiceController {
   private static Map<String, Product> productRepo = new HashMap<>();
   
   @RequestMapping(value = "/products", method = RequestMethod.POST)
   public ResponseEntity<Object> createProduct(@RequestBody Product product) {
      productRepo.put(product.getId(), product);
      return new ResponseEntity<>("Product is created successfully", HttpStatus.CREATED);
   }
}

PUT API

Запрос HTTP PUT используется для обновления существующего ресурса. Этот метод содержит тело запроса. Мы можем отправлять параметры запроса и переменные пути для определения настраиваемого или динамического URL.

В приведенном ниже примере показано, как определить метод запроса HTTP PUT. В этом примере мы использовали HashMap для обновления существующего продукта, где продукт является классом POJO.

Здесь URI запроса /products/{id}который вернет строку после продукта в репозиторий HashMap. Обратите внимание, что мы использовали переменную Path{id} который определяет идентификатор продукта, который необходимо обновить.

package com.tutorialspoint.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.tutorialspoint.demo.model.Product;

@RestController
public class ProductServiceController {
   private static Map<String, Product> productRepo = new HashMap<>();
   
   @RequestMapping(value = "/products/{id}", method = RequestMethod.PUT)
   public ResponseEntity<Object> updateProduct(@PathVariable("id") String id, @RequestBody Product product) { 
      productRepo.remove(id);
      product.setId(id);
      productRepo.put(id, product);
      return new ResponseEntity<>("Product is updated successsfully", HttpStatus.OK);
   }   
}

УДАЛИТЬ API

HTTP-запрос на удаление используется для удаления существующего ресурса. Этот метод не содержит тела запроса. Мы можем отправлять параметры запроса и переменные пути для определения настраиваемого или динамического URL.

В приведенном ниже примере показано, как определить метод запроса HTTP DELETE. В этом примере мы использовали HashMap для удаления существующего продукта, который является классом POJO.

URI запроса: /products/{id}и он вернет строку после удаления продукта из репозитория HashMap. Мы использовали переменную Path{id} который определяет идентификатор продукта, который необходимо удалить.

package com.tutorialspoint.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.tutorialspoint.demo.model.Product;

@RestController
public class ProductServiceController {
   private static Map<String, Product> productRepo = new HashMap<>();
   
   @RequestMapping(value = "/products/{id}", method = RequestMethod.DELETE)
   public ResponseEntity<Object> delete(@PathVariable("id") String id) { 
      productRepo.remove(id);
      return new ResponseEntity<>("Product is deleted successsfully", HttpStatus.OK);
   }
}

В этом разделе представлен полный набор исходного кода. Соблюдайте следующие коды для их соответствующих функций -

The Spring Boot main application class – DemoApplication.java

package com.tutorialspoint.demo;

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

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

The POJO class – Product.java

package com.tutorialspoint.demo.model;

public class Product {
   private String id;
   private String name;

   public String getId() {
      return id;
   }
   public void setId(String id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}

The Rest Controller class – ProductServiceController.java

package com.tutorialspoint.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.tutorialspoint.demo.model.Product;

@RestController
public class ProductServiceController {
   private static Map<String, Product> productRepo = new HashMap<>();
   static {
      Product honey = new Product();
      honey.setId("1");
      honey.setName("Honey");
      productRepo.put(honey.getId(), honey);
      
      Product almond = new Product();
      almond.setId("2");
      almond.setName("Almond");
      productRepo.put(almond.getId(), almond);
   }
   
   @RequestMapping(value = "/products/{id}", method = RequestMethod.DELETE)
   public ResponseEntity<Object> delete(@PathVariable("id") String id) { 
      productRepo.remove(id);
      return new ResponseEntity<>("Product is deleted successsfully", HttpStatus.OK);
   }
   
   @RequestMapping(value = "/products/{id}", method = RequestMethod.PUT)
   public ResponseEntity<Object> updateProduct(@PathVariable("id") String id, @RequestBody Product product) { 
      productRepo.remove(id);
      product.setId(id);
      productRepo.put(id, product);
      return new ResponseEntity<>("Product is updated successsfully", HttpStatus.OK);
   }
   
   @RequestMapping(value = "/products", method = RequestMethod.POST)
   public ResponseEntity<Object> createProduct(@RequestBody Product product) {
      productRepo.put(product.getId(), product);
      return new ResponseEntity<>("Product is created successfully", HttpStatus.CREATED);
   }
   
   @RequestMapping(value = "/products")
   public ResponseEntity<Object> getProduct() {
      return new ResponseEntity<>(productRepo.values(), HttpStatus.OK);
   }
}

Вы можете создать исполняемый файл JAR и запустить приложение весенней загрузки, используя приведенные ниже команды Maven или Gradle, как показано:

Для Maven используйте команду, показанную ниже -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle используйте команду, показанную ниже -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Вы можете запустить файл JAR с помощью команды, показанной ниже -

java –jar <JARFILE>

Это запустит приложение на порту 8080 Tomcat, как показано ниже -

Теперь нажмите URL-адрес, показанный ниже, в приложении POSTMAN и посмотрите результат.

URL GET API: http://localhost:8080/products

URL-адрес POST API: http://localhost:8080/products

URL-адрес PUT API: http://localhost:8080/products/3

URL-адрес DELETE API: http://localhost:8080/products/3

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

Прежде чем приступить к обработке исключений, давайте разберемся со следующими аннотациями.

Совет контроллера

@ControllerAdvice - это аннотация для глобальной обработки исключений.

Обработчик исключений

@ExceptionHandler - это аннотация, используемая для обработки определенных исключений и отправки настраиваемых ответов клиенту.

Вы можете использовать следующий код для создания класса @ControllerAdvice для глобальной обработки исключений:

package com.tutorialspoint.demo.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;

@ControllerAdvice
   public class ProductExceptionController {
}

Определите класс, расширяющий класс RuntimeException.

package com.tutorialspoint.demo.exception;

public class ProductNotfoundException extends RuntimeException {
   private static final long serialVersionUID = 1L;
}

Вы можете определить метод @ExceptionHandler для обработки исключений, как показано. Этот метод следует использовать для записи файла класса Controller Advice.

@ExceptionHandler(value = ProductNotfoundException.class)

public ResponseEntity<Object> exception(ProductNotfoundException exception) {
}

Теперь используйте приведенный ниже код, чтобы вызвать исключение из API.

@RequestMapping(value = "/products/{id}", method = RequestMethod.PUT)
public ResponseEntity<Object> updateProduct() { 
   throw new ProductNotfoundException();
}

Полный код для обработки исключения приведен ниже. В этом примере мы использовали PUT API для обновления продукта. Здесь при обновлении продукта, если продукт не найден, возвращается ответное сообщение об ошибке «Продукт не найден». Обратите внимание, чтоProductNotFoundException класс исключения должен расширять RuntimeException.

package com.tutorialspoint.demo.exception;
public class ProductNotfoundException extends RuntimeException {
   private static final long serialVersionUID = 1L;
}

Класс Controller Advice для глобальной обработки исключения приведен ниже. Мы можем определить любые методы обработчика исключений в этом файле класса.

package com.tutorialspoint.demo.exception;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class ProductExceptionController {
   @ExceptionHandler(value = ProductNotfoundException.class)
   public ResponseEntity<Object> exception(ProductNotfoundException exception) {
      return new ResponseEntity<>("Product not found", HttpStatus.NOT_FOUND);
   }
}

Ниже приведен файл контроллера API службы продукта для обновления продукта. Если Товар не найден, то выдаетProductNotFoundException класс.

package com.tutorialspoint.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.tutorialspoint.demo.exception.ProductNotfoundException;
import com.tutorialspoint.demo.model.Product;

@RestController
public class ProductServiceController {
   private static Map<String, Product> productRepo = new HashMap<>();
   static {
      Product honey = new Product();
      honey.setId("1");
      honey.setName("Honey");
      productRepo.put(honey.getId(), honey);
      
      Product almond = new Product();
      almond.setId("2");
      almond.setName("Almond");
      productRepo.put(almond.getId(), almond);
   }
   
   @RequestMapping(value = "/products/{id}", method = RequestMethod.PUT)
   public ResponseEntity<Object> updateProduct(@PathVariable("id") String id, @RequestBody Product product) { 
      if(!productRepo.containsKey(id))throw new ProductNotfoundException();
      productRepo.remove(id);
      product.setId(id);
      productRepo.put(id, product);
      return new ResponseEntity<>("Product is updated successfully", HttpStatus.OK);
   }
}

Код для основного файла класса приложения Spring Boot приведен ниже -

package com.tutorialspoint.demo;

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

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

Код для POJO class для продукта приведен ниже -

package com.tutorialspoint.demo.model;
public class Product {
   private String id;
   private String name;

   public String getId() {
      return id;
   }
   public void setId(String id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}

Код для Maven build – pom.xml показано ниже -

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>demo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.8.RELEASE</version>
      <relativePath/> 
   </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-web</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Код для Gradle Build – build.gradle приведено ниже -

buildscript {
   ext {
      springBootVersion = '1.5.8.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

Вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью команд Maven или Gradle -

Для Maven вы можете использовать следующую команду -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle вы можете использовать следующую команду -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Вы можете запустить файл JAR с помощью следующей команды -

java –jar <JARFILE>

Это запустит приложение на порту 8080 Tomcat, как показано ниже -

Теперь нажмите указанный ниже URL-адрес в приложении POSTMAN, и вы увидите результат, как показано ниже -

URL обновления: http: // localhost: 8080 / products / 3

Вы можете использовать Interceptor в Spring Boot для выполнения операций в следующих ситуациях:

  • Перед отправкой запроса контроллеру

  • Перед отправкой ответа клиенту

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

Для работы с перехватчиком необходимо создать @Component класс, который его поддерживает, и он должен реализовывать HandlerInterceptor интерфейс.

Ниже приведены три метода, о которых вы должны знать при работе над перехватчиками.

  • preHandle()метод - используется для выполнения операций перед отправкой запроса контроллеру. Этот метод должен возвращать истину, чтобы вернуть ответ клиенту.

  • postHandle() метод - используется для выполнения операций перед отправкой ответа клиенту.

  • afterCompletion() метод - используется для выполнения операций после завершения запроса и ответа.

Обратите внимание на следующий код для лучшего понимания -

@Component
public class ProductServiceInterceptor implements HandlerInterceptor {
   @Override
   public boolean preHandle(
      HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
      
      return true;
   }
   @Override
   public void postHandle(
      HttpServletRequest request, HttpServletResponse response, Object handler, 
      ModelAndView modelAndView) throws Exception {}
   
   @Override
   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
      Object handler, Exception exception) throws Exception {}
}

Вам нужно будет зарегистрировать этот перехватчик с InterceptorRegistry используя WebMvcConfigurerAdapter как показано ниже -

@Component
public class ProductServiceInterceptorAppConfig extends WebMvcConfigurerAdapter {
   @Autowired
   ProductServiceInterceptor productServiceInterceptor;

   @Override
   public void addInterceptors(InterceptorRegistry registry) {
      registry.addInterceptor(productServiceInterceptor);
   }
}

В приведенном ниже примере мы собираемся использовать API продуктов GET, который дает результат, как указано ниже -

Код для класса Interceptor ProductServiceInterceptor.java приведен ниже -

package com.tutorialspoint.demo.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

@Component
public class ProductServiceInterceptor implements HandlerInterceptor {
   @Override
   public boolean preHandle
      (HttpServletRequest request, HttpServletResponse response, Object handler) 
      throws Exception {
      
      System.out.println("Pre Handle method is Calling");
      return true;
   }
   @Override
   public void postHandle(HttpServletRequest request, HttpServletResponse response, 
      Object handler, ModelAndView modelAndView) throws Exception {
      
      System.out.println("Post Handle method is Calling");
   }
   @Override
   public void afterCompletion
      (HttpServletRequest request, HttpServletResponse response, Object 
      handler, Exception exception) throws Exception {
      
      System.out.println("Request and Response is completed");
   }
}

Код для файла класса конфигурации приложения для регистрации перехватчика в реестре перехватчиков - ProductServiceInterceptorAppConfig.java, приведен ниже -

package com.tutorialspoint.demo.interceptor;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Component
public class ProductServiceInterceptorAppConfig extends WebMvcConfigurerAdapter {
   @Autowired
   ProductServiceInterceptor productServiceInterceptor;

   @Override
   public void addInterceptors(InterceptorRegistry registry) {
      registry.addInterceptor(productServiceInterceptor);
   }
}

Код для файла класса контроллера ProductServiceController.java приведен ниже -

package com.tutorialspoint.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.tutorialspoint.demo.exception.ProductNotfoundException;
import com.tutorialspoint.demo.model.Product;

@RestController
public class ProductServiceController {
   private static Map<String, Product> productRepo = new HashMap<>();   
   static {      
      Product honey = new Product();
      honey.setId("1");
      honey.setName("Honey");
      productRepo.put(honey.getId(), honey);      
      Product almond = new Product();
      almond.setId("2");
      almond.setName("Almond");
      productRepo.put(almond.getId(), almond);      
   }
   @RequestMapping(value = "/products")
   public ResponseEntity<Object> getProduct() {
      return new ResponseEntity<>(productRepo.values(), HttpStatus.OK);
   }
}

Код для класса POJO для Product.java приведен ниже -

package com.tutorialspoint.demo.model;

public class Product {
   private String id;
   private String name;

   public String getId() {
      return id;
   }
   public void setId(String id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}

Код для основного файла класса приложения Spring Boot DemoApplication.java приведено ниже -

package com.tutorialspoint.demo;

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

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

Код для сборки Maven - pom.xml показан здесь -

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "
   http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>demo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.8.RELEASE</version>
      <relativePath/> 
   </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-web</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Код для сборки Gradle build.gradle показан здесь -

buildscript {
   ext {
      springBootVersion = '1.5.8.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

Вы можете создать исполняемый файл JAR и запустить приложение Spring Boot, используя приведенные ниже команды Maven или Gradle.

Для Maven используйте команду, как показано ниже -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle используйте команду, как показано ниже -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Вы можете запустить файл JAR с помощью следующей команды -

java –jar <JARFILE>

Теперь приложение запущено на порту 8080 Tomcat, как показано ниже -

Теперь нажмите указанный ниже URL-адрес в приложении POSTMAN, и вы увидите результат, как показано ниже -

ПОЛУЧИТЬ API: http://localhost:8080/products

В окне консоли вы можете увидеть операторы System.out.println, добавленные в Interceptor, как показано на скриншоте ниже -

Фильтр - это объект, используемый для перехвата HTTP-запросов и ответов вашего приложения. Используя фильтр, мы можем выполнить две операции в двух экземплярах:

  • Перед отправкой запроса контроллеру
  • Перед отправкой ответа клиенту.

В следующем коде показан пример кода для класса реализации фильтра сервлетов с аннотацией @Component.

@Component
public class SimpleFilter implements Filter {
   @Override
   public void destroy() {}

   @Override
   public void doFilter
      (ServletRequest request, ServletResponse response, FilterChain filterchain) 
      throws IOException, ServletException {}

   @Override
   public void init(FilterConfig filterconfig) throws ServletException {}
}

В следующем примере показан код для чтения удаленного хоста и удаленного адреса из объекта ServletRequest перед отправкой запроса на контроллер.

В метод doFilter () мы добавили операторы System.out.println для печати удаленного хоста и удаленного адреса.

package com.tutorialspoint.demo;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.springframework.stereotype.Component;

@Component
public class SimpleFilter implements Filter {
   @Override
   public void destroy() {}

   @Override
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterchain) 
      throws IOException, ServletException {
      
      System.out.println("Remote Host:"+request.getRemoteHost());
      System.out.println("Remote Address:"+request.getRemoteAddr());
      filterchain.doFilter(request, response);
   }

   @Override
   public void init(FilterConfig filterconfig) throws ServletException {}
}

В главный файл класса приложения Spring Boot мы добавили простую конечную точку REST, которая возвращает строку «Hello World».

package com.tutorialspoint.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {
   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
   @RequestMapping(value = "/")
   public String hello() {
      return "Hello World";
   }
}

Код для сборки Maven - pom.xml приведено ниже -

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "
   http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>demo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.8.RELEASE</version>
      <relativePath/> 
   </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-web</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Код для Gradle Build - build.gradle приведен ниже -

buildscript {
   ext {
      springBootVersion = '1.5.8.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

Вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью команд Maven или Gradle, показанных ниже -

Для Maven используйте команду, как показано ниже -

mvn clean install

После BUILD SUCCESS вы можете найти файл JAR в целевом каталоге.

Для Gradle используйте команду, как показано ниже -

gradle clean build

После BUILD SUCCESSFUL вы можете найти файл JAR в каталоге build / libs.

Теперь запустите файл JAR, используя следующую команду

java –jar <JARFILE>

Вы можете видеть, что приложение запущено на порту 8080 Tomcat.

Теперь нажмите URL-адрес http://localhost:8080/и посмотрите результат Hello World. Это должно выглядеть, как показано ниже -

Затем вы можете увидеть удаленный хост и удаленный адрес в журнале консоли, как показано ниже -

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

Пользовательский порт

в application.properties файл, мы можем установить собственный номер порта для свойства server.port

server.port = 9090

в application.yml файл, вы можете найти следующее -

server: 
   port: 9090

Случайный порт

в application.properties файла, мы можем установить случайный номер порта для свойства server.port

server.port = 0

в application.yml файл, вы можете найти следующее -

server: 
   port: 0

Note - Если server.port number равно 0 при запуске приложения Spring Boot, Tomcat использует случайный номер порта.

Шаблон Rest используется для создания приложений, использующих веб-службы RESTful. Вы можете использоватьexchange()для использования веб-служб для всех методов HTTP. Приведенный ниже код показывает, как создать Bean for Rest Template для автоматического подключения объекта Rest Template.

package com.tutorialspoint.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class DemoApplication {
   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
   @Bean
   public RestTemplate getRestTemplate() {
      return new RestTemplate();
   }
}

ПОЛУЧИТЬ

Consuming the GET API by using RestTemplate - exchange() method

Предположим, этот URL http://localhost:8080/products возвращает следующий JSON, и мы собираемся использовать этот ответ API с помощью шаблона Rest, используя следующий код -

[
   {
      "id": "1",
      "name": "Honey"
   },
   {
      "id": "2",
      "name": "Almond"
   }
]

Вам нужно будет следовать указанным пунктам, чтобы использовать API -

  • Автоматически подключил объект шаблона Rest.
  • Используйте HttpHeaders для установки заголовков запроса.
  • Используйте HttpEntity, чтобы обернуть объект запроса.
  • Укажите URL-адрес, HttpMethod и тип возврата для метода Exchange ().
@RestController
public class ConsumeWebService {
   @Autowired
   RestTemplate restTemplate;

   @RequestMapping(value = "/template/products")
   public String getProductList() {
      HttpHeaders headers = new HttpHeaders();
      headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
      HttpEntity <String> entity = new HttpEntity<String>(headers);
      
      return restTemplate.exchange("
         http://localhost:8080/products", HttpMethod.GET, entity, String.class).getBody();
   }
}

ПОСЛЕ

Consuming POST API by using RestTemplate - exchange() method

Предположим, этот URL http://localhost:8080/products возвращает ответ, показанный ниже, мы собираемся использовать этот ответ API, используя шаблон Rest.

Приведенный ниже код является телом запроса -

{
   "id":"3",
   "name":"Ginger"
}

Приведенный ниже код является телом ответа -

Product is created successfully

Вам нужно будет следовать пунктам, приведенным ниже, чтобы использовать API -

  • Автоматически подключил объект шаблона Rest.

  • Используйте HttpHeaders, чтобы установить заголовки запроса.

  • Используйте HttpEntity, чтобы обернуть объект запроса. Здесь мы оборачиваем объект Product, чтобы отправить его в тело запроса.

  • Укажите URL-адрес, HttpMethod и тип возврата для метода exchange ().

@RestController
public class ConsumeWebService {
   @Autowired
   RestTemplate restTemplate;

   @RequestMapping(value = "/template/products", method = RequestMethod.POST)
   public String createProducts(@RequestBody Product product) {
      HttpHeaders headers = new HttpHeaders();
      headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
      HttpEntity<Product> entity = new HttpEntity<Product>(product,headers);
      
      return restTemplate.exchange(
         "http://localhost:8080/products", HttpMethod.POST, entity, String.class).getBody();
   }
}

ПОЛОЖИТЬ

Consuming PUT API by using RestTemplate - exchange() method

Предположим, этот URL http://localhost:8080/products/3 возвращает ответ ниже, и мы собираемся использовать этот ответ API с помощью Rest Template.

Приведенный ниже код - это тело запроса -

{
   "name":"Indian Ginger"
}

Приведенный ниже код является телом ответа -

Product is updated successfully

Вам нужно будет следовать пунктам, приведенным ниже, чтобы использовать API -

  • Автоматически подключил объект шаблона Rest.

  • Используйте HttpHeaders для установки заголовков запроса.

  • Используйте HttpEntity, чтобы обернуть объект запроса. Здесь мы оборачиваем объект Product, чтобы отправить его в тело запроса.

  • Укажите URL-адрес, HttpMethod и тип возврата для метода exchange ().

@RestController
public class ConsumeWebService {
   @Autowired
   RestTemplate restTemplate;

   @RequestMapping(value = "/template/products/{id}", method = RequestMethod.PUT)
   public String updateProduct(@PathVariable("id") String id, @RequestBody Product product) {
      HttpHeaders headers = new HttpHeaders();
      headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
      HttpEntity<Product> entity = new HttpEntity<Product>(product,headers);
      
      return restTemplate.exchange(
         "http://localhost:8080/products/"+id, HttpMethod.PUT, entity, String.class).getBody();
   }
}

УДАЛЯТЬ

Consuming DELETE API by using RestTemplate - exchange() method

Предположим, этот URL http://localhost:8080/products/3 возвращает ответ, приведенный ниже, и мы собираемся использовать этот ответ API с помощью Rest Template.

Эта строка кода, показанная ниже, является телом ответа -

Product is deleted successfully

Вам нужно будет следовать пунктам, показанным ниже, чтобы использовать API -

  • Автоматически подключил объект шаблона Rest.

  • Используйте HttpHeaders для установки заголовков запроса.

  • Используйте HttpEntity, чтобы обернуть объект запроса.

  • Укажите URL-адрес, HttpMethod и тип возврата для метода exchange ().

@RestController
public class ConsumeWebService {
   @Autowired
   RestTemplate restTemplate;

   @RequestMapping(value = "/template/products/{id}", method = RequestMethod.DELETE)
   public String deleteProduct(@PathVariable("id") String id) {
      HttpHeaders headers = new HttpHeaders();
      headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
      HttpEntity<Product> entity = new HttpEntity<Product>(headers);
      
      return restTemplate.exchange(
         "http://localhost:8080/products/"+id, HttpMethod.DELETE, entity, String.class).getBody();
   }
}

Полный файл класса Rest Template Controller приведен ниже -

package com.tutorialspoint.demo.controller;

import java.util.Arrays;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.tutorialspoint.demo.model.Product;

@RestController
public class ConsumeWebService {
   @Autowired
   RestTemplate restTemplate;

   @RequestMapping(value = "/template/products")
   public String getProductList() {
      HttpHeaders headers = new HttpHeaders();
      headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
      HttpEntity<String> entity = new HttpEntity<String>(headers);
      
      return restTemplate.exchange(
         "http://localhost:8080/products", HttpMethod.GET, entity, String.class).getBody();
   }
   @RequestMapping(value = "/template/products", method = RequestMethod.POST)
   public String createProducts(@RequestBody Product product) {
      HttpHeaders headers = new HttpHeaders();
      headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
      HttpEntity<Product> entity = new HttpEntity<Product>(product,headers);
      
      return restTemplate.exchange(
         "http://localhost:8080/products", HttpMethod.POST, entity, String.class).getBody();
   }
   @RequestMapping(value = "/template/products/{id}", method = RequestMethod.PUT)
   public String updateProduct(@PathVariable("id") String id, @RequestBody Product product) {
      HttpHeaders headers = new HttpHeaders();
      headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
      HttpEntity<Product> entity = new HttpEntity<Product>(product,headers);
      
      return restTemplate.exchange(
         "http://localhost:8080/products/"+id, HttpMethod.PUT, entity, String.class).getBody();
   }
   @RequestMapping(value = "/template/products/{id}", method = RequestMethod.DELETE)
   public String deleteProduct(@PathVariable("id") String id) {
      HttpHeaders headers = new HttpHeaders();
      headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
      HttpEntity<Product> entity = new HttpEntity<Product>(headers);
      
      return restTemplate.exchange(
         "http://localhost:8080/products/"+id, HttpMethod.DELETE, entity, String.class).getBody();
   }
}

Код для класса приложения Spring Boot - DemoApplication.java приведен ниже -

package com.tutorialspoint.demo;

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

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

Код для сборки Maven - pom.xml приведен ниже -

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>demo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.8.RELEASE</version>
      <relativePath/> 
   </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-web</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Код для Gradle Build - build.gradle приведен ниже -

buildscript {
   ext {
      springBootVersion = '1.5.8.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

Вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью следующих команд Maven или Gradle:

Для Maven вы можете использовать команду, приведенную ниже -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle вы можете использовать команду, показанную ниже -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Теперь запустите файл JAR, используя следующую команду -

java –jar <JARFILE>

Теперь приложение запущено на порту 8080 Tomcat.

Теперь нажмите приведенный ниже URL-адрес в приложении POSTMAN, и вы можете увидеть результат.

ПОЛУЧИТЬ продукты по шаблону Rest - http://localhost:8080/template/products

Создать продукт POST - http://localhost:8080/template/products

Обновить PUT продукта - http://localhost:8080/template/products/3

Удалить продукт - http://localhost:8080/template/products/3

В этой главе вы узнаете, как загрузить и загрузить файл с помощью веб-службы.

Файл загружен

Для загрузки файла вы можете использовать MultipartFileв качестве параметра запроса, и этот API должен использовать значение данных формы Multi-Part. Соблюдайте код, приведенный ниже -

@RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)

public String fileUpload(@RequestParam("file") MultipartFile file) {
   return null;
}

Полный код для этого приведен ниже -

package com.tutorialspoint.demo.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
public class FileUploadController {
   @RequestMapping(value = "/upload", method = RequestMethod.POST, 
      consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
   
   public String fileUpload(@RequestParam("file") MultipartFile file) throws IOException {
      File convertFile = new File("/var/tmp/"+file.getOriginalFilename());
      convertFile.createNewFile();
      FileOutputStream fout = new FileOutputStream(convertFile);
      fout.write(file.getBytes());
      fout.close();
      return "File is upload successfully";
   }
}

Скачать файл

Для загрузки файла вы должны использовать InputStreamResource для загрузки файла. Нам нужно установить HttpHeaderContent-Disposition в Response и необходимо указать Media Type ответа приложения.

Note - В следующем примере файл должен быть доступен по указанному пути, где запущено приложение.

@RequestMapping(value = "/download", method = RequestMethod.GET) 
public ResponseEntity<Object> downloadFile() throws IOException  {
   String filename = "/var/tmp/mysql.png";
   File file = new File(filename);
   InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
   HttpHeaders headers = new HttpHeaders();
      
   headers.add("Content-Disposition", String.format("attachment; filename=\"%s\"", file.getName()));
   headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
   headers.add("Pragma", "no-cache");
   headers.add("Expires", "0");
      
   ResponseEntity<Object> 
   responseEntity = ResponseEntity.ok().headers(headers).contentLength(file.length()).contentType(
      MediaType.parseMediaType("application/txt")).body(resource);
      
   return responseEntity;
}

Полный код для этого приведен ниже -

package com.tutorialspoint.demo.controller;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FileDownloadController {
   @RequestMapping(value = "/download", method = RequestMethod.GET) 
   public ResponseEntity<Object> downloadFile() throws IOException  {
      String filename = "/var/tmp/mysql.png";
      File file = new File(filename);
      InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
      HttpHeaders headers = new HttpHeaders();
      
      headers.add("Content-Disposition", String.format("attachment; filename=\"%s\"", file.getName()));
      headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
      headers.add("Pragma", "no-cache");
      headers.add("Expires", "0");
      
      ResponseEntity<Object> 
      responseEntity = ResponseEntity.ok().headers(headers).contentLength(
         file.length()).contentType(MediaType.parseMediaType("application/txt")).body(resource);
      
      return responseEntity;
   }
}

Основное приложение Spring Boot приведено ниже -

package com.tutorialspoint.demo;

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

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

Код для сборки Maven - pom.xml приведен ниже -

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>demo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.8.RELEASE</version>
      <relativePath/> 
   </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-web</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Код для Gradle Build - build.gradle приведен ниже -

buildscript {
   ext {
      springBootVersion = '1.5.8.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

Теперь вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью команд Maven или Gradle, приведенных ниже -

Для Maven используйте команду, приведенную ниже -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle вы можете использовать команду, показанную ниже -

sgradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Теперь запустите файл JAR, используя следующую команду -

java –jar <JARFILE>

Это запустит приложение на порту 8080 Tomcat, как показано ниже -

Теперь нажмите приведенный ниже URL-адрес в приложении POSTMAN, и вы увидите результат, как показано ниже -

Загрузка файла - http://localhost:8080/upload

Загрузка файла - http://localhost:8080/upload

Компоненты службы - это файл класса, который содержит аннотацию @Service. Эти файлы классов используются для написания бизнес-логики на другом уровне, отделенном от файла класса @RestController. Логика создания файла класса сервисного компонента показана здесь -

public interface ProductService {
}

Класс, реализующий интерфейс с аннотацией @Service, выглядит следующим образом:

@Service
public class ProductServiceImpl implements ProductService {
}

Обратите внимание, что в этом руководстве мы используем Product Service API(s)для хранения, извлечения, обновления и удаления продуктов. Мы написали бизнес-логику в самом файле класса @RestController. Теперь мы собираемся переместить код бизнес-логики из контроллера в компонент службы.

Вы можете создать интерфейс, который содержит методы добавления, редактирования, получения и удаления, используя код, как показано ниже -

package com.tutorialspoint.demo.service;

import java.util.Collection;
import com.tutorialspoint.demo.model.Product;

public interface ProductService {
   public abstract void createProduct(Product product);
   public abstract void updateProduct(String id, Product product);
   public abstract void deleteProduct(String id);
   public abstract Collection<Product> getProducts();
}

Следующий код позволит вам создать класс, реализующий интерфейс ProductService с аннотацией @Service, и написать бизнес-логику для хранения, извлечения, удаления и обновления продукта.

package com.tutorialspoint.demo.service;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Service;
import com.tutorialspoint.demo.model.Product;

@Service
public class ProductServiceImpl implements ProductService {
   private static Map<String, Product> productRepo = new HashMap<>();
   static {
      Product honey = new Product();
      honey.setId("1");
      honey.setName("Honey");
      productRepo.put(honey.getId(), honey);

      Product almond = new Product();
      almond.setId("2");
      almond.setName("Almond");
      productRepo.put(almond.getId(), almond);
   }
   @Override
   public void createProduct(Product product) {
      productRepo.put(product.getId(), product);
   }
   @Override
   public void updateProduct(String id, Product product) {
      productRepo.remove(id);
      product.setId(id);
      productRepo.put(id, product);
   }
   @Override
   public void deleteProduct(String id) {
      productRepo.remove(id);

   }
   @Override
   public Collection<Product> getProducts() {
      return productRepo.values();
   }
}

Код здесь показывает файл класса Rest Controller, здесь мы @Autowired интерфейс ProductService и вызывали методы.

package com.tutorialspoint.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.tutorialspoint.demo.model.Product;
import com.tutorialspoint.demo.service.ProductService;

@RestController
public class ProductServiceController {
   @Autowired
   ProductService productService;

   @RequestMapping(value = "/products")
   public ResponseEntity<Object> getProduct() {
      return new ResponseEntity<>(productService.getProducts(), HttpStatus.OK);
   }
   @RequestMapping(value = "/products/{id}", method = RequestMethod.PUT)
   public ResponseEntity<Object> 
      updateProduct(@PathVariable("id") String id, @RequestBody Product product) {
      
      productService.updateProduct(id, product);
      return new ResponseEntity<>("Product is updated successsfully", HttpStatus.OK);
   }
   @RequestMapping(value = "/products/{id}", method = RequestMethod.DELETE)
   public ResponseEntity<Object> delete(@PathVariable("id") String id) {
      productService.deleteProduct(id);
      return new ResponseEntity<>("Product is deleted successsfully", HttpStatus.OK);
   }
   @RequestMapping(value = "/products", method = RequestMethod.POST)
   public ResponseEntity<Object> createProduct(@RequestBody Product product) {
      productService.createProduct(product);
      return new ResponseEntity<>("Product is created successfully", HttpStatus.CREATED);
   }
}

Код для класса POJO - Product.java показан здесь -

package com.tutorialspoint.demo.model;

public class Product {
   private String id;
   private String name;

   public String getId() {
      return id;
   }
   public void setId(String id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}

Основное приложение Spring Boot приведено ниже -

package com.tutorialspoint.demo;

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

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

Код для сборки Maven - pom.xml показан ниже -

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>demo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.8.RELEASE</version>
      <relativePath/> 
   </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-web</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>

</project>

Код для Gradle Build - build.gradle показан ниже -

buildscript {
   ext {
      springBootVersion = '1.5.8.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

Вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью команд Maven или Gradle, приведенных ниже -

Для Maven используйте команду, как показано ниже -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle вы можете использовать команду, как показано ниже -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Запустите файл JAR с помощью команды, приведенной ниже -

java –jar <JARFILE>

Теперь приложение запущено на порту 8080 Tomcat, как показано на изображении ниже -

Теперь нажмите приведенный ниже URL-адрес в приложении POSTMAN, и вы увидите результат, как показано ниже -

URL GET API - http://localhost:8080/products

URL-адрес POST API - http://localhost:8080/products

URL-адрес PUT API - http://localhost:8080/products/3

URL-адрес DELETE API - http://localhost:8080/products/3

Thymeleaf - это библиотека на основе Java, используемая для создания веб-приложений. Он обеспечивает хорошую поддержку для обслуживания XHTML / HTML5 в веб-приложениях. В этой главе вы подробно узнаете о Тимелеафе.

Шаблоны Тимелеафа

Thymeleaf преобразует ваши файлы в правильно сформированные файлы XML. Он содержит 6 типов шаблонов, как указано ниже -

  • XML
  • Действительный XML
  • XHTML
  • Действительный XHTML
  • HTML5
  • Устаревший HTML5

Все шаблоны, за исключением Legacy HTML5, относятся к правильно сформированным допустимым файлам XML. Устаревший HTML5 позволяет нам отображать теги HTML5 на веб-странице, включая незакрытые теги.

Веб приложение

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

Используйте следующий код для создания файла класса @Controller для перенаправления URI запроса в файл HTML:

package com.tutorialspoint.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class WebController {
   @RequestMapping(value = "/index")
   public String index() {
      return "index";
   }
}

В приведенном выше примере URI запроса - /index, и элемент управления перенаправляется в файл index.html. Обратите внимание, что файл index.html следует поместить в каталог шаблонов, а все файлы JS и CSS следует поместить в каталог static в пути к классам. В показанном примере мы использовали файл CSS для изменения цвета текста.

Вы можете использовать следующий код и создать файл CSS в отдельной папке css и назовите файл styles.css -

h4 {
   color: red;
}

Код для файла index.html приведен ниже -

<!DOCTYPE html>
<html>
   <head>
      <meta charset = "ISO-8859-1" />
      <link href = "css/styles.css" rel = "stylesheet"/>
      <title>Spring Boot Application</title>
   </head>
   <body>
      <h4>Welcome to Thymeleaf Spring Boot web application</h4>
   </body>
</html>

Проводник проекта показан на скриншоте ниже -

Теперь нам нужно добавить зависимость Spring Boot Starter Thymeleaf в наш файл конфигурации сборки.

Пользователи Maven могут добавить следующую зависимость в файл pom.xml:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Пользователи Gradle могут добавить следующую зависимость в файл build.gradle:

compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf'

Код для основного файла класса приложения Spring Boot приведен ниже -

package com.tutorialspoint.demo;

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

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

Код для Maven - pom.xml приведен ниже -

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>demo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.8.RELEASE</version>
      <relativePath />
   </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-web</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-thymeleaf</artifactId>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Код для Gradle - build.gradle приведен ниже -

buildscript {
   ext {
      springBootVersion = '1.5.8.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
   compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf'
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

Вы можете создать исполняемый файл JAR и запустить приложение весенней загрузки с помощью следующих команд Maven или Gradle:

Для Maven используйте команду, как показано ниже -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle используйте команду, как показано ниже -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Запустите файл JAR, используя приведенную здесь команду -

java –jar <JARFILE>

Теперь приложение запущено на порту 8080 Tomcat, как показано ниже -

Теперь нажмите URL-адрес в своем веб-браузере, и вы увидите результат, как показано -

http://localhost:8080/index

В этой главе будет подробно рассмотрено использование веб-служб RESTful с помощью jQuery AJAX.

Создайте простое веб-приложение Spring Boot и напишите файлы классов контроллера, которые используются для перенаправления в файл HTML для использования веб-служб RESTful.

Нам нужно добавить стартовый компонент Spring Boot Thymeleaf и веб-зависимость в наш файл конфигурации сборки.

Для пользователей Maven добавьте указанные ниже зависимости в свой файл pom.xml.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Для пользователей Gradle добавьте следующие зависимости в свой файл build.gradle -

compile group: ‘org.springframework.boot’, name: ‘spring-boot-starter-thymeleaf’
compile(‘org.springframework.boot:spring-boot-starter-web’)

Код для файла класса @Controller приведен ниже -

@Controller
public class ViewController {
}

Вы можете определить методы URI запроса для перенаправления в файл HTML, как показано ниже -

@RequestMapping(“/view-products”)
public String viewProducts() {
   return “view-products”;
}
@RequestMapping(“/add-products”)
public String addProducts() {
   return “add-products”;
}

Этот API http://localhost:9090/products должен вернуть приведенный ниже JSON в ответ, как показано ниже -

[
   {
      "id": "1",
      "name": "Honey"
   },
   {
      "id": "2",
      "name": "Almond"
   }
]

Теперь создайте файл view-products.html в каталоге шаблонов пути к классам.

В HTML-файл мы добавили библиотеку jQuery и написали код для использования веб-службы RESTful при загрузке страницы.

<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

<script>
$(document).ready(function(){
   $.getJSON("http://localhost:9090/products", function(result){ $.each(result, function(key,value) {
         $("#productsJson").append(value.id+" "+value.name+" ");
      }); 
   });
});
</script>

Метод POST и этот URL http://localhost:9090/products должен содержать нижеследующее тело запроса и тело ответа.

Код для тела запроса приведен ниже -

{
   "id":"3",
   "name":"Ginger"
}

Код для тела ответа приведен ниже -

Product is created successfully

Теперь создайте файл add-products.html в каталоге шаблонов в пути к классам.

В HTML-файл мы добавили библиотеку jQuery и написали код, который отправляет форму в веб-службу RESTful при нажатии кнопки.

<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
   $(document).ready(function() {
      $("button").click(function() { var productmodel = { id : "3", name : "Ginger" }; var requestJSON = JSON.stringify(productmodel); $.ajax({
            type : "POST",
            url : "http://localhost:9090/products",
            headers : {
               "Content-Type" : "application/json"
            },
            data : requestJSON,
            success : function(data) {
               alert(data);
            },
            error : function(data) {
            }
         });
      });
   });
</script>

Полный код приведен ниже.

Maven - файл pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>demo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.8.RELEASE</version>
      <relativePath />
   </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-web</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-thymeleaf</artifactId>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Код для Gradle - build.gradle приведен ниже -

buildscript {
   ext {
      springBootVersion = ‘1.5.8.RELEASE’
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: ‘java’
apply plugin: ‘eclipse’
apply plugin: ‘org.springframework.boot’

group = ‘com.tutorialspoint’
version = ‘0.0.1-SNAPSHOT’
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}

dependencies {
   compile(‘org.springframework.boot:spring-boot-starter-web’)
   compile group: ‘org.springframework.boot’, name: ‘spring-boot-starter-thymeleaf’
   testCompile(‘org.springframework.boot:spring-boot-starter-test’)
}

Ниже приведен файл класса контроллера - ViewController.java -

package com.tutorialspoint.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ViewController {
   @RequestMapping(“/view-products”)
   public String viewProducts() {
      return “view-products”;
   }
   @RequestMapping(“/add-products”)
   public String addProducts() {
      return “add-products”;   
   }   
}

Файл view-products.html приведен ниже -

<!DOCTYPE html>
<html>
   <head>
      <meta charset = "ISO-8859-1"/>
      <title>View Products</title>
      <script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
      
      <script>
         $(document).ready(function(){
            $.getJSON("http://localhost:9090/products", function(result){ $.each(result, function(key,value) {
                  $("#productsJson").append(value.id+" "+value.name+" ");
               }); 
            });
         });
      </script>
   </head>
   
   <body>
      <div id = "productsJson"> </div>
   </body>
</html>

Файл add-products.html приведен ниже -

<!DOCTYPE html>
<html>
   <head>
      <meta charset = "ISO-8859-1" />
      <title>Add Products</title>
      <script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
      
      <script>
         $(document).ready(function() {
            $("button").click(function() { var productmodel = { id : "3", name : "Ginger" }; var requestJSON = JSON.stringify(productmodel); $.ajax({
                  type : "POST",
                  url : "http://localhost:9090/products",
                  headers : {
                     "Content-Type" : "application/json"
                  },
                  data : requestJSON,
                  success : function(data) {
                     alert(data);
                  },
                  error : function(data) {
                  }
               });
            });
         });
      </script>
   </head>
   
   <body>
      <button>Click here to submit the form</button>
   </body>
</html>

Основной файл класса Spring Boot Application приведен ниже -

package com.tutorialspoint.demo;

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

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

Теперь вы можете создать исполняемый файл JAR и запустить приложение Spring Boot, используя следующие команды Maven или Gradle.

Для Maven используйте команду, указанную ниже -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle используйте команду, указанную ниже -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Запустите файл JAR с помощью следующей команды -

java –jar <JARFILE>

Теперь приложение запущено на порту 8080 Tomcat.

Теперь нажмите URL-адрес в своем веб-браузере, и вы увидите результат, как показано -

http: // localhost: 8080 / просмотр продуктов

http: // localhost: 8080 / add-products

Теперь нажмите кнопку Click here to submit the form и вы можете увидеть результат, как показано -

Теперь нажмите URL-адрес просмотра продуктов и посмотрите созданный продукт.

http://localhost:8080/view-products

Угловой JS

Чтобы использовать API с помощью Angular JS, вы можете использовать приведенные ниже примеры:

Используйте следующий код, чтобы создать Angular JS Controller для использования GET API: http://localhost:9090/products -

angular.module('demo', [])
.controller('Hello', function($scope, $http) {
   $http.get('http://localhost:9090/products'). then(function(response) { $scope.products = response.data;
   });
});

Используйте следующий код, чтобы создать Angular JS Controller для использования POST API: http://localhost:9090/products -

angular.module('demo', [])
.controller('Hello', function($scope, $http) {
   $http.post('http://localhost:9090/products',data).
   then(function(response) {
      console.log("Product created successfully");
   });
});

Note - Данные метода Post представляют собой тело запроса в формате JSON для создания продукта.

Совместное использование ресурсов между источниками (CORS) - это концепция безопасности, которая позволяет ограничивать ресурсы, реализованные в веб-браузерах. Это предотвращает создание или использование кода JavaScript запросов от другого источника.

Например, ваше веб-приложение работает на порту 8080, и с помощью JavaScript вы пытаетесь использовать веб-службы RESTful с порта 9090. В таких ситуациях вы столкнетесь с проблемой безопасности совместного использования ресурсов между источниками в своих веб-браузерах.

Для решения этой проблемы необходимы два требования:

  • Веб-службы RESTful должны поддерживать совместное использование ресурсов между источниками.

  • Приложение веб-службы RESTful должно разрешать доступ к API через порт 8080.

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

Включить CORS в методе контроллера

Нам нужно установить источник для веб-службы RESTful, используя @CrossOriginаннотация для метода контроллера. Эта аннотация @CrossOrigin поддерживает определенный REST API, а не для всего приложения.

@RequestMapping(value = "/products")
@CrossOrigin(origins = "http://localhost:8080")

public ResponseEntity<Object> getProduct() {
   return null;
}

Глобальная конфигурация CORS

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

@Bean
public WebMvcConfigurer corsConfigurer() {
   return new WebMvcConfigurerAdapter() {
      @Override
      public void addCorsMappings(CorsRegistry registry) {
         registry.addMapping("/products").allowedOrigins("http://localhost:9000");
      }    
   };
}

Ниже приведен код для глобальной установки конфигурации CORS в основном приложении Spring Boot.

package com.tutorialspoint.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@SpringBootApplication
public class DemoApplication {
   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
   @Bean
   public WebMvcConfigurer corsConfigurer() {
      return new WebMvcConfigurerAdapter() {
         @Override
         public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/products").allowedOrigins("http://localhost:8080");
         }
      };
   }
}

Теперь вы можете создать веб-приложение Spring Boot, которое работает на порту 8080, и приложение веб-службы RESTful, которое может работать на порту 9090. Для получения дополнительных сведений о реализации веб-службы RESTful вы можете обратиться к главе под названиемConsuming RESTful Web Services этого учебника.

Интернационализация - это процесс, который позволяет адаптировать ваше приложение к разным языкам и регионам без инженерных изменений исходного кода. Другими словами, интернационализация - это готовность к локализации.

В этой главе мы подробно узнаем о том, как реализовать интернационализацию в Spring Boot.

Зависимости

Нам нужна зависимость Spring Boot Starter Web и Spring Boot Starter Thymeleaf для разработки веб-приложения в Spring Boot.

Maven

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Gradle

compile('org.springframework.boot:spring-boot-starter-web')
compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf'

LocaleResolver

Нам нужно определить локаль по умолчанию для вашего приложения. Нам нужно добавить bean-компонент LocaleResolver в наше приложение Spring Boot.

@Bean
public LocaleResolver localeResolver() {
   SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
   sessionLocaleResolver.setDefaultLocale(Locale.US);
   return sessionLocaleResolver;
}

LocaleChangeInterceptor

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

@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
   LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
   localeChangeInterceptor.setParamName("language");
   return localeChangeInterceptor;
}

Чтобы получить этот эффект, нам нужно добавить LocaleChangeInterceptor в перехватчик реестра приложения. Класс конфигурации должен расширять класс WebMvcConfigurerAdapter и переопределять метод addInterceptors ().

@Override
public void addInterceptors(InterceptorRegistry registry) {
   registry.addInterceptor(localeChangeInterceptor());
}

Источники сообщений

Приложение Spring Boot по умолчанию берет источники сообщений из src/main/resourcesпапка в пути к классам. Имя файла сообщения локали по умолчанию должно бытьmessage.properties и файлы для каждой локали следует называть как messages_XX.properties. «XX» представляет код языкового стандарта.

Все свойства сообщения должны использоваться как значения пары ключей. Если какие-либо свойства не найдены в локали, приложение использует свойство по умолчанию из файла messages.properties.

По умолчанию messages.properties будут такими, как показано -

welcome.text=Hi Welcome to Everyone

Французский язык messages_fr.properties будет таким, как показано -

welcome.text=Salut Bienvenue à tous

Note - Исходный файл сообщений должен быть сохранен в формате «UTF-8».

HTML файл

В файле HTML используйте синтаксис #{key} для отображения сообщений из файла свойств.

<h1 th:text = "#{welcome.text}"></h1>

Полный код приведен ниже

Maven - pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>demo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.8.RELEASE</version>
      <relativePath />
   </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-web</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-thymeleaf</artifactId>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
</project>

Gradle - build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.8.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
   compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf'
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

Основной файл класса приложения Spring Boot приведен ниже -

package com.tutorialspoint.demo;

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

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

Файл класса контроллера приведен ниже -

package com.tutorialspoint.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ViewController {
   @RequestMapping("/locale")
   public String locale() {
      return "locale";
   }
}

Класс конфигурации для поддержки интернационализации

package com.tutorialspoint.demo;

import java.util.Locale;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;

@Configuration
public class Internationalization extends WebMvcConfigurerAdapter {
   @Bean
   public LocaleResolver localeResolver() {
      SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
      sessionLocaleResolver.setDefaultLocale(Locale.US);
      return sessionLocaleResolver;
   }
   @Bean
   public LocaleChangeInterceptor localeChangeInterceptor() {
      LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
      localeChangeInterceptor.setParamName("language");
      return localeChangeInterceptor;
   }
   @Override
   public void addInterceptors(InterceptorRegistry registry) {
      registry.addInterceptor(localeChangeInterceptor());
   }
}

Источники сообщений - messages.properties, как показано -

welcome.text = Hi Welcome to Everyone

Источники сообщений - message_fr.properties такие, как показано -

welcome.text = Salut Bienvenue à tous

HTML-файл locale.html должен быть помещен в каталог шаблонов в пути к классам, как показано:

<!DOCTYPE html>
<html>
   <head>
      <meta charset = "ISO-8859-1"/>
      <title>Internationalization</title>
   </head>
   <body>
      <h1 th:text = "#{welcome.text}"></h1>
   </body>
</html>

Вы можете создать исполняемый файл JAR и запустить приложение загрузки Spring с помощью следующих команд Maven или Gradle:

Для Maven используйте следующую команду -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle используйте следующую команду -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Теперь запустите файл JAR, используя команду, как показано -

java –jar <JARFILE>

Вы обнаружите, что приложение запущено на порту 8080 Tomcat.

Теперь нажмите URL-адрес http://localhost:8080/locale в вашем веб-браузере, и вы увидите следующий результат -

URL http://localhost:8080/locale?language=fr даст вам результат, как показано -

Планирование - это процесс выполнения задач за определенный период времени. Spring Boot обеспечивает хорошую поддержку для написания планировщика для приложений Spring.

Выражение Java Cron

Выражения Java Cron используются для настройки экземпляров CronTrigger, подкласса org.quartz.Trigger. Для получения дополнительной информации о выражении Java cron вы можете обратиться к этой ссылке -

https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm

Аннотация @EnableScheduling используется для включения планировщика для вашего приложения. Эта аннотация должна быть добавлена ​​в основной файл класса приложения Spring Boot.

@SpringBootApplication
@EnableScheduling

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

Аннотация @Scheduled используется для запуска планировщика на определенный период времени.

@Scheduled(cron = "0 * 9 * * ?")
public void cronJobSch() throws Exception {
}

Ниже приведен пример кода, который показывает, как выполнять задачу каждую минуту, начиная с 9:00 утра и заканчивая в 9:59 утра, каждый день.

package com.tutorialspoint.demo.scheduler;

import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class Scheduler {
   @Scheduled(cron = "0 * 9 * * ?")
   public void cronJobSch() {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
      Date now = new Date();
      String strDate = sdf.format(now);
      System.out.println("Java cron job expression:: " + strDate);
   }
}

На следующем снимке экрана показано, как приложение запускалось в 09:03:23 и каждую минуту с этого момента выполнялась задача планировщика заданий cron.

Фиксированная ставка

Планировщик с фиксированной скоростью используется для выполнения задач в определенное время. Он не ждет завершения предыдущей задачи. Значения должны быть в миллисекундах. Пример кода показан здесь -

@Scheduled(fixedRate = 1000)
public void fixedRateSch() { 
}

Здесь показан пример кода для выполнения задачи каждую секунду с момента запуска приложения -

package com.tutorialspoint.demo.scheduler;

import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class Scheduler {
   @Scheduled(fixedRate = 1000)
   public void fixedRateSch() {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

      Date now = new Date();
      String strDate = sdf.format(now);
      System.out.println("Fixed Rate scheduler:: " + strDate);
   }
}

Обратите внимание на следующий снимок экрана, на котором показано приложение, запущенное в 09:12:00, и после этого каждая вторая задача планировщика с фиксированной скоростью выполнялась.

Фиксированная задержка

Планировщик с фиксированной задержкой используется для выполнения задач в определенное время. Он должен дождаться завершения предыдущей задачи. Значения должны быть в миллисекундах. Здесь показан пример кода -

@Scheduled(fixedDelay = 1000, initialDelay = 1000)
public void fixedDelaySch() {
}

Здесь initialDelay - это время, по истечении которого задача будет выполнена в первый раз после значения начальной задержки.

Пример выполнения задачи каждую секунду через 3 секунды после запуска приложения показан ниже -

package com.tutorialspoint.demo.scheduler;

import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class Scheduler {
   @Scheduled(fixedDelay = 1000, initialDelay = 3000)
   public void fixedDelaySch() {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
      Date now = new Date();
      String strDate = sdf.format(now);
      System.out.println("Fixed Delay scheduler:: " + strDate);
   }
}

Обратите внимание на следующий снимок экрана, на котором показано приложение, запущенное в 09:18:39, и каждые 3 секунды задача планировщика с фиксированной задержкой выполняется каждую секунду.

По умолчанию приложение Spring Boot использует порт HTTP 8080 при запуске приложения.

Вам необходимо выполнить следующие шаги, чтобы настроить HTTPS и порт 443 в приложении Spring Boot -

  • Получите сертификат SSL - создайте самозаверяющий сертификат или получите его в центре сертификации

  • Включить HTTPS и порт 443

Самоподписанный сертификат

Для создания самозаверяющего сертификата среда выполнения Java поставляется в комплекте с утилитой управления сертификатами. Этот служебный инструмент используется для создания самозаверяющего сертификата. Это показано в приведенном здесь коде -

keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
Enter keystore password:
   Re-enter new password:
   What is your first and last name?
   [Unknown]:
   What is the name of your organizational unit?
   [Unknown]:
   What is the name of your organization?
   [Unknown]:
   What is the name of your City or Locality?
   [Unknown]:
   What is the name of your State or Province?
   [Unknown]:
   What is the two-letter country code for this unit?
   [Unknown]:
   Is CN = Unknown, OU=Unknown, O = Unknown, L = Unknown, ST = Unknown, C = Unknown correct?
   [no]: yes

Этот код сгенерирует файл хранилища ключей PKCS12 с именем keystore.p12 и псевдонимом сертификата tomcat.

Настроить HTTPS

Нам нужно указать порт сервера как 443, путь к файлу хранилища ключей, пароль хранилища ключей, тип хранилища ключей и имя псевдонима ключа в файле application.properties. Соблюдайте приведенный здесь код -

server.port: 443
server.ssl.key-store: keystore.p12
server.ssl.key-store-password: springboot
server.ssl.keyStoreType: PKCS12
server.ssl.keyAlias: tomcat

Вы можете использовать следующий код, если используете свойства YAML, используйте ниже application.yml -

server:
   port: 443
   ssl:
      key-store: keystore.p12
      key-store-password: springboot
      keyStoreType: PKCS12
      keyAlias: tomcat

Вы можете создать исполняемый файл JAR и запустить приложение весенней загрузки, используя следующие команды Maven или Gradle.

Для Maven вы можете использовать следующую команду -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle вы можете использовать команду

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Теперь запустите файл JAR, используя следующую команду -

java –jar <JARFILE>

Теперь приложение запущено на порту 443 Tomcat с https, как показано -

Eureka Server - это приложение, в котором хранится информация обо всех клиентских сервисных приложениях. Каждая служба Micro регистрируется на сервере Eureka, и сервер Eureka знает все клиентские приложения, работающие на каждом порту и IP-адресе. Eureka Server также известен как Discovery Server.

В этой главе мы подробно узнаем о том, как создать сервер Eureka.

Создание сервера Eureka

Eureka Server поставляется с пакетом Spring Cloud. Для этого нам нужно разработать сервер Eureka и запустить его на порту 8761 по умолчанию.

Посетите домашнюю страницу Spring Initializer https://start.spring.io/и загрузите проект Spring Boot с зависимостью от сервера Eureka. Это показано на скриншоте ниже -

После загрузки проекта в основной файл класса Spring Boot Application нам нужно добавить аннотацию @EnableEurekaServer. Аннотация @EnableEurekaServer используется для того, чтобы ваше приложение Spring Boot действовало как сервер Eureka.

Код для основного файла класса приложения Spring Boot показан ниже -

package com.tutorialspoint.eurekaserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaserverApplication {
   public static void main(String[] args) {
      SpringApplication.run(EurekaserverApplication.class, args);
   }
}

Убедитесь, что зависимость сервера Spring Cloud Eureka добавлена ​​в ваш файл конфигурации сборки.

Код для зависимости пользователя Maven показан ниже -

<dependency>
<groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

Код для зависимости пользователя Gradle приведен ниже -

compile('org.springframework.cloud:spring-cloud-starter-eureka-server')

Полный файл конфигурации сборки приведен ниже -

Maven pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>eurekaserver</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>eurekaserver</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.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>
      <spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-eureka-server</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Gradle – build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
ext {
   springCloudVersion = 'Edgware.RELEASE'
}
dependencies {
   compile('org.springframework.cloud:spring-cloud-starter-eureka-server')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}
dependencyManagement {
   imports {
      mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
   }
}

По умолчанию сервер Eureka регистрируется для обнаружения. Вам следует добавить приведенную ниже конфигурацию в файл application.properties или application.yml.

Файл application.properties приведен ниже -

eureka.client.registerWithEureka = false
eureka.client.fetchRegistry = false
server.port = 8761

Файл application.yml приведен ниже -

eureka:
   client:
      registerWithEureka: false
      fetchRegistry: false
server:
   port: 8761

Теперь вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью команд Maven или Gradle, показанных ниже -

Для Maven используйте команду, как показано ниже -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle вы можете использовать команду, показанную ниже -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Теперь запустите файл JAR, используя следующую команду -

java –jar <JARFILE>

Вы можете обнаружить, что приложение запущено на порту 8761 Tomcat, как показано ниже -

Теперь нажмите URL-адрес http://localhost:8761/ в вашем веб-браузере, и вы можете найти сервер Eureka, работающий на порту 8761, как показано ниже -

В этой главе вы подробно узнаете о том, как зарегистрировать приложение службы Spring Boot Micro на сервере Eureka Server. Перед регистрацией приложения убедитесь, что Eureka Server работает на порту 8761, или сначала соберите Eureka Server и запустите его. Для получения дополнительной информации о создании сервера Eureka вы можете обратиться к предыдущей главе.

Во-первых, вам нужно добавить следующие зависимости в наш файл конфигурации сборки, чтобы зарегистрировать микросервис на сервере Eureka.

Пользователи Maven могут добавить следующие зависимости в pom.xml файл -

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

Пользователи Gradle могут добавить следующие зависимости в build.gradle файл -

compile('org.springframework.cloud:spring-cloud-starter-eureka')

Теперь нам нужно добавить аннотацию @EnableEurekaClient в основной файл класса приложения Spring Boot. Аннотация @EnableEurekaClient заставляет ваше приложение Spring Boot действовать как клиент Eureka.

Основное приложение Spring Boot приведено ниже -

package com.tutorialspoint.eurekaclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class EurekaclientApplication {
   public static void main(String[] args) {
      SpringApplication.run(EurekaclientApplication.class, args);
   }
}

Чтобы зарегистрировать приложение Spring Boot на сервере Eureka Server, нам нужно добавить следующую конфигурацию в наш файл application.properties или файл application.yml и указать URL-адрес сервера Eureka в нашей конфигурации.

Код для файла application.yml приведен ниже -

eureka:
   client:
      serviceUrl:
         defaultZone: http://localhost:8761/eureka
      instance:
      preferIpAddress: true
spring:
   application:
      name: eurekaclient

Код для файла application.properties приведен ниже -

eureka.client.serviceUrl.defaultZone  = http://localhost:8761/eureka
eureka.client.instance.preferIpAddress = true
spring.application.name = eurekaclient

Теперь добавьте конечную точку Rest для возврата String в основном приложении Spring Boot и веб-зависимость Spring Boot Starter в файле конфигурации сборки. Соблюдайте код, приведенный ниже -

package com.tutorialspoint.eurekaclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaclientApplication {
   public static void main(String[] args) {
      SpringApplication.run(EurekaclientApplication.class, args);
   }
   @RequestMapping(value = "/")
   public String home() {
      return "Eureka Client application";
   }
}

Полный файл конфигурации представлен ниже.

For Maven user - pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>eurekaclient</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>eurekaclient</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.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>
      <spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-eureka</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>
   
   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>
   
   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>   
   </build>
   
</projecta>

For Gradle user – build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' group = 'com.tutorialspoint' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } ext { springCloudVersion = 'Edgware.RELEASE' } dependencies { compile('org.springframework.cloud:spring-cloud-starter-eureka') testCompile('org.springframework.boot:spring-boot-starter-test') compile('org.springframework.boot:spring-boot-starter-web') } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
   }
}

Вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью следующих команд Maven или Gradle:

Для Maven вы можете использовать следующую команду -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle вы можете использовать следующую команду -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Теперь запустите файл JAR, используя команду, как показано -

java –jar <JARFILE>

Теперь приложение запущено на порту Tomcat 8080, и приложение Eureka Client зарегистрировано на сервере Eureka, как показано ниже -

Нажмите URL-адрес http: // localhost: 8761 / в своем веб-браузере, и вы увидите, что приложение Eureka Client зарегистрировано на сервере Eureka.

Теперь нажмите URL-адрес http://localhost:8080/ в своем веб-браузере и просмотрите выходные данные Rest Endpoint.

Zuul Server - это приложение-шлюз, которое обрабатывает все запросы и выполняет динамическую маршрутизацию приложений микросервисов. Сервер Zuul также известен как пограничный сервер.

Например, /api/user сопоставляется с пользовательской службой, а / api / products сопоставляется со службой продукта, а Zuul Server динамически направляет запросы в соответствующее внутреннее приложение.

В этой главе мы подробно рассмотрим, как создать приложение Zuul Server в Spring Boot.

Создание серверного приложения Zuul

Сервер Zuul связан с зависимостью Spring Cloud. Вы можете скачать проект Spring Boot со страницы Spring Initializer.https://start.spring.io/ и выберите зависимость Zuul Server.

Добавьте аннотацию @EnableZuulProxy в ваше основное приложение Spring Boot. Аннотация @EnableZuulProxy используется для того, чтобы ваше приложение Spring Boot действовало как прокси-сервер Zuul.

package com.tutorialspoint.zuulserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication
@EnableZuulProxy
public class ZuulserverApplication {
   public static void main(String[] args) {
      SpringApplication.run(ZuulserverApplication.class, args);
   }
}

Вам нужно будет добавить зависимость Spring Cloud Starter Zuul в наш файл конфигурации сборки.

Пользователи Maven должны будут добавить следующую зависимость в ваш pom.xml файл -

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>

Для пользователей Gradle добавьте приведенную ниже зависимость в свой файл build.gradle

compile('org.springframework.cloud:spring-cloud-starter-zuul')

Для маршрутизации Zuul добавьте указанные ниже свойства в файл application.properties или application.yml.

spring.application.name = zuulserver
zuul.routes.products.path = /api/demo/**
zuul.routes.products.url = http://localhost:8080/
server.port = 8111

Это означает, что http обращается к /api/demo/переадресовать в службу продуктов. Например,/api/demo/products пересылается /products.

yaml пользователи могут использовать файл application.yml, показанный ниже -

server:
   port: 8111
spring:
   application:  
      name: zuulserver
zuul:

routes:
   products:
      path: /api/demo/**
      url: http://localhost:8080/

Note - The http://localhost:8080/ приложение уже должно быть запущено перед маршрутизацией через Zuul Proxy.

Полный файл конфигурации сборки представлен ниже.

Пользователи Maven могут использовать файл pom.xml, указанный ниже -

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>zuulserver</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>zuulserver</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.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>
      <spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-zuul</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
</project>

Пользователи Gradle могут использовать файл build.gradle, указанный ниже -

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
ext {
   springCloudVersion = 'Edgware.RELEASE'
}
dependencies {
   compile('org.springframework.cloud:spring-cloud-starter-zuul')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}
dependencyManagement {
   imports {
      mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
   }
}

Вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью команд Maven или Gradle, приведенных ниже -

Для Maven вы можете использовать команду, приведенную ниже -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle вы можете использовать команду, приведенную ниже -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Теперь запустите файл JAR, используя команду, показанную ниже -

java –jar <JARFILE>

Вы можете обнаружить, что приложение запущено на порту 8111 Tomcat, как показано здесь.

Теперь нажмите URL-адрес http://localhost:8111/api/demo/products в вашем веб-браузере, и вы можете увидеть вывод /products Конечная точка REST, как показано ниже -

Spring Cloud Configuration Server - это централизованное приложение, которое управляет всеми свойствами конфигурации, связанными с приложением. В этой главе вы подробно узнаете о том, как создать сервер Spring Cloud Configuration.

Создание сервера конфигурации Spring Cloud

Сначала загрузите проект Spring Boot со страницы Spring Initializer и выберите зависимость Spring Cloud Config Server. Обратите внимание на снимок экрана, приведенный ниже -

Теперь добавьте зависимость сервера Spring Cloud Config в файл конфигурации сборки, как описано ниже -

Пользователи Maven могут добавить приведенную ниже зависимость в файл pom.xml.

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-config-server</artifactId>
</dependency>

Пользователи Gradle могут добавить приведенную ниже зависимость в ваш файл build.gradle.

compile('org.springframework.cloud:spring-cloud-config-server')

Теперь добавьте аннотацию @EnableConfigServer в свой основной файл класса приложения Spring Boot. Аннотация @EnableConfigServer заставляет ваше приложение Spring Boot действовать как сервер конфигурации.

Основной файл класса приложения Spring Boot приведен ниже -

package com.tutorialspoint.configserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer
public class ConfigserverApplication {
   public static void main(String[] args) {
      SpringApplication.run(ConfigserverApplication.class, args);
   }
}

Теперь добавьте приведенную ниже конфигурацию в свой файл свойств и замените файл application.properties на файл bootstrap.properties. Соблюдайте код, приведенный ниже -

server.port = 8888
spring.cloud.config.server.native.searchLocations=file:///C:/configprop/
SPRING_PROFILES_ACTIVE=native

Сервер конфигурации работает на порту 8888 Tomcat, и свойства конфигурации приложения загружаются из собственных мест поиска.

Сейчас в file:///C:/configprop/, разместите свое клиентское приложение - файл application.properties. Например, имя вашего клиентского приложенияconfig-client, затем переименуйте файл application.properties как config-client.properties и поместите файл свойств по пути file:///C:/configprop/.

Код для файла свойств config-client приведен ниже -

welcome.message = Welcome to Spring cloud config server

Полный файл конфигурации сборки приведен ниже -

Пользователи Maven могут использовать pom.xml приведено ниже -

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>configserver</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>configserver</name>
   <description>Demo project for Spring Boot</description>
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.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>
      <spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-config-server</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Пользователи Gradle могут использовать файл build.gradle, указанный ниже -

<scope>import</scope>
</dependency>
</dependencies>
buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' group = 'com.tutorialspoint' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } ext { springCloudVersion = 'Edgware.RELEASE' } dependencies { compile('org.springframework.cloud:spring-cloud-config-server') testCompile('org.springframework.boot:spring-boot-starter-test') } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
   }
}

Теперь создайте исполняемый файл JAR и запустите приложение Spring Boot, используя следующие команды Maven или Gradle:

Для Maven используйте команду, приведенную ниже -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle используйте команду, приведенную ниже -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Запустите файл JAR с помощью следующей команды -

java –jar <JARFILE>

Теперь приложение запущено на порту 8888 Tomcat, как показано здесь -

Теперь нажмите URL-адрес http://localhost:8888/config-client/default/master в вашем веб-браузере, и вы можете увидеть свойства конфигурации вашего приложения config-client, как показано здесь.

Некоторым приложениям могут потребоваться свойства конфигурации, которые могут потребовать изменения, и разработчикам может потребоваться удалить их или перезапустить приложение для выполнения этого. Однако это может привести к простою в производственной среде и необходимости перезапуска приложения. Spring Cloud Configuration Server позволяет разработчикам загружать новые свойства конфигурации без перезапуска приложения и без простоев.

Работа с сервером конфигурации Spring Cloud

Сначала загрузите проект Spring Boot из https://start.spring.io/и выберите зависимость клиента Spring Cloud Config. Теперь добавьте зависимость Spring Cloud Starter Config в файл конфигурации сборки.

Пользователи Maven могут добавить следующую зависимость в файл pom.xml.

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

Пользователи Gradle могут добавить следующую зависимость в build.gradle файл.

compile('org.springframework.cloud:spring-cloud-starter-config')

Теперь вам нужно добавить аннотацию @RefreshScope в ваше основное приложение Spring Boot. Аннотация @RefreshScope используется для загрузки значения свойств конфигурации с сервера Config.

package com.example.configclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;

@SpringBootApplication
@RefreshScope
public class ConfigclientApplication {
   public static void main(String[] args) {
      SpringApplication.run(ConfigclientApplication.class, args);
   }
}

Теперь добавьте URL-адрес сервера конфигурации в файл application.properties и укажите имя приложения.

Note - http: // localhost: сервер конфигурации 8888 должен быть запущен перед запуском клиентского приложения конфигурации.

spring.application.name = config-client
spring.cloud.config.uri = http://localhost:8888

Код для написания простой конечной точки REST для чтения приветственного сообщения с сервера конфигурации приведен ниже:

package com.example.configclient;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RefreshScope
@RestController
public class ConfigclientApplication {
   @Value("${welcome.message}")
   String welcomeText;
   
   public static void main(String[] args) {
      SpringApplication.run(ConfigclientApplication.class, args);
   }
   @RequestMapping(value = "/")
   public String welcomeText() {
      return welcomeText;
   }
}

Вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью следующих команд Maven или Gradle:

Для Maven вы можете использовать команду, показанную ниже -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle вы можете использовать команду, показанную ниже -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Теперь запустите файл JAR, используя показанную здесь команду:

java –jar <JARFILE>

Теперь приложение запущено на порту 8080 Tomcat, как показано здесь -

Вы можете увидеть журнал в окне консоли; Приложение config-client получает конфигурацию изhttps://localhost:8888

2017-12-08 12:41:57.682  INFO 1104 --- [           
   main] c.c.c.ConfigServicePropertySourceLocator : 
   Fetching config from server at: http://localhost:8888

Теперь нажмите URL-адрес, http://localhost:8080/ приветственное сообщение загружается с сервера конфигурации.

Теперь перейдите и измените значение свойства на сервере конфигурации и нажмите URL-адрес POST конечной точки привода. http://localhost:8080/refresh и увидеть новое значение свойства конфигурации в URL http://localhost:8080/

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

Включение Spring Boot Actuator

Чтобы включить конечные точки исполнительного механизма Spring Boot в ваше приложение Spring Boot, нам необходимо добавить зависимость исполнительного механизма Spring Boot Starter в наш файл конфигурации сборки.

Пользователи Maven могут добавить приведенную ниже зависимость в свой файл pom.xml.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Пользователи Gradle могут добавить приведенную ниже зависимость в ваш файл build.gradle.

compile group: 'org.springframework.boot', name: 'spring-boot-starter-actuator'

В файле application.properties нам нужно отключить безопасность для конечных точек исполнительных механизмов.

management.security.enabled = false

Пользователи файла YAML могут добавить следующее свойство в файл application.yml.

management:
   security:
      enabled: false

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

management.port = 9000

Пользователи файла YAML могут добавить следующее свойство в файл application.yml.

management:
   port: 9000

Теперь вы можете создать исполняемый файл JAR и запустить приложение Spring Boot, используя следующие команды Maven или Gradle.

Для Maven вы можете использовать следующую команду -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle вы можете использовать следующую команду -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Теперь вы можете запустить файл JAR с помощью следующей команды -

java –jar <JARFILE>

Теперь приложение запущено на порту 8080 Tomcat. Обратите внимание, что если вы указали номер порта управления, то одно и то же приложение будет работать на двух разных номерах порта.

Некоторые важные конечные точки Spring Boot Actuator приведены ниже. Вы можете ввести их в свой веб-браузер и отслеживать поведение вашего приложения.

КОНЕЧНЫЕ ТОЧКИ ПРИМЕНЕНИЕ
/ метрики Для просмотра таких показателей приложения, как используемая память, свободная память, потоки, классы, время безотказной работы системы и т. Д.
/ env Чтобы просмотреть список переменных среды, используемых в приложении.
/фасоль Чтобы просмотреть компоненты Spring и их типы, области действия и зависимости.
/здоровье Для просмотра работоспособности приложения
/Информация Для просмотра информации о приложении Spring Boot.
/ трассировка Чтобы просмотреть список следов ваших конечных точек отдыха.

Наблюдать за вашим приложением с помощью Spring Boot Actuator Endpoint немного сложно. Потому что, если у вас n приложений, каждое приложение имеет отдельные конечные точки исполнительных механизмов, что затрудняет мониторинг. Spring Boot Admin Server - это приложение, используемое для управления и мониторинга вашего приложения Microservice.

Чтобы справиться с такими ситуациями, CodeCentric Team предоставляет пользовательский интерфейс Spring Boot Admin для управления и мониторинга всех конечных точек Actuator приложения Spring Boot в одном месте.

Для создания Spring Boot Admin Server нам необходимо добавить указанные ниже зависимости в файл конфигурации сборки.

Пользователи Maven могут добавить следующие зависимости в свой файл pom.xml:

<dependency>
   <groupId>de.codecentric</groupId>
   <artifactId>spring-boot-admin-server</artifactId>
   <version>1.5.5</version>
</dependency>
<dependency>
   <groupId>de.codecentric</groupId>
   <artifactId>spring-boot-admin-server-ui</artifactId>
   <version>1.5.5</version>
</dependency>

Пользователи Gradle могут добавить следующие зависимости в ваш файл build.gradle -

compile group: 'de.codecentric', name: 'spring-boot-admin-server', version: '1.5.5'
compile group: 'de.codecentric', name: 'spring-boot-admin-server-ui', version: '1.5.5'

Добавьте аннотацию @EnableAdminServer в свой основной файл класса приложения Spring Boot. Аннотация @EnableAdminServer используется для того, чтобы ваш сервер администратора мог отслеживать все другие микросервисы.

package com.tutorialspoint.adminserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import de.codecentric.boot.admin.config.EnableAdminServer;

@SpringBootApplication
@EnableAdminServer
public class AdminserverApplication {   
   public static void main(String[] args) {
      SpringApplication.run(AdminserverApplication.class, args);
   }
}

Теперь определите server.port и имя приложения в файле application.properties, как показано -

server.port = 9090
spring.application.name = adminserver

Для пользователей YAML используйте следующие свойства, чтобы определить номер порта и имя приложения в файле application.yml.

server:
   port: 9090
spring:
   application:
      name: adminserver

Файл конфигурации сборки приведен ниже.

For Maven users – pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>adminserver</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>adminserver</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.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</artifactId>
      </dependency>

      <dependency>
         <groupId>de.codecentric</groupId>
         <artifactId>spring-boot-admin-server</artifactId>
         <version>1.5.5</version>
      </dependency>
      
      <dependency>
         <groupId>de.codecentric</groupId>
         <artifactId>spring-boot-admin-server-ui</artifactId>
         <version>1.5.5</version>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

For Gradle users – build.gradle file

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {   
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter')
   compile group: 'de.codecentric', name: 'spring-boot-admin-server', version: '1.5.5'
   compile group: 'de.codecentric', name: 'spring-boot-admin-server-ui', version: '1.5.5'   
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

Вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью следующих команд Maven или Gradle:

Для Maven используйте команду, показанную здесь -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle используйте команду, показанную здесь -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Теперь запустите файл JAR с помощью команды, приведенной ниже -

java –jar <JARFILE>

Теперь приложение запущено на порту 9090 Tomcat, как показано здесь -

Теперь нажмите указанный ниже URL-адрес в своем веб-браузере и посмотрите пользовательский интерфейс сервера администратора.

http://localhost:9090/

Для мониторинга и управления вашим приложением микросервисов через Spring Boot Admin Server необходимо добавить начальную клиентскую зависимость Spring Boot Admin и указать URI сервера администратора в файле свойств приложения.

Note - Для мониторинга приложения вы должны включить конечные точки Spring Boot Actuator для своего приложения Microservice.

Сначала добавьте следующую зависимость стартового клиента Spring Boot Admin и зависимость стартового исполнительного механизма Spring Boot в файл конфигурации сборки.

Пользователи Maven могут добавить следующие зависимости в ваш файл pom.xml:

<dependency>
   <groupId>de.codecentric</groupId>
   <artifactId>spring-boot-admin-starter-client</artifactId>
   <version>1.5.5</version>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Пользователи Gradle могут добавить следующие зависимости в ваш файл build.gradle.

compile group: 'de.codecentric', name: 'spring-boot-admin-starter-client', version: '1.5.5'
compile('org.springframework.boot:spring-boot-starter-actuator')

Теперь добавьте URL-адрес Spring Boot Admin Server в файл свойств вашего приложения.

Для пользователей файла свойств добавьте следующие свойства в файл application.properties.

spring.boot.admin.url = http://localhost:9090/

Для пользователей YAML добавьте следующее свойство в файл application.yml.

spring:
   boot:
      admin:
         url: http://localhost:9000/

Теперь создайте исполняемый файл JAR и запустите приложение Spring Boot, используя следующие команды Maven или Gradle.

Для Maven вы можете использовать команду, как показано -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle вы можете использовать команду, как показано -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Теперь запустите файл JAR, используя показанную команду -

java –jar <JARFILE>

Теперь приложение запущено на порту 9090 Tomcat, как показано -

Теперь нажмите следующий URL-адрес в своем веб-браузере и увидите, что ваше приложение Spring Boot зарегистрировано в Spring Boot Admin Server.

http://localhost:9090/

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

Swagger2 - это проект с открытым исходным кодом, используемый для создания документов REST API для веб-служб RESTful. Он предоставляет пользовательский интерфейс для доступа к нашим веб-службам RESTful через веб-браузер.

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

<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>

Для пользователей Gradle добавьте следующие зависимости в свой файл build.gradle.

compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.7.0'
compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.7.0'

Теперь добавьте аннотацию @ EnableSwagger2 в ваше основное приложение Spring Boot. Аннотация @ EnableSwagger2 используется для включения Swagger2 для вашего приложения Spring Boot.

Код для основного приложения Spring Boot показан ниже -

package com.tutorialspoint.swaggerdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@SpringBootApplication
@EnableSwagger2
public class SwaggerDemoApplication {
   public static void main(String[] args) {
      SpringApplication.run(SwaggerDemoApplication.class, args);
   }
}

Затем создайте Docket Bean, чтобы настроить Swagger2 для вашего приложения Spring Boot. Нам нужно определить базовый пакет для настройки REST API (ов) для Swagger2.

@Bean
   public Docket productApi() {
      return new Docket(DocumentationType.SWAGGER_2).select()
         .apis(RequestHandlerSelectors.basePackage("com.tutorialspoint.swaggerdemo")).build();
   }

Теперь добавьте этот bean-компонент в сам основной файл класса приложения Spring Boot, и ваш основной класс приложения Spring Boot будет выглядеть, как показано ниже -

package com.tutorialspoint.swaggerdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@SpringBootApplication
@EnableSwagger2
public class SwaggerDemoApplication {
   public static void main(String[] args) {
      SpringApplication.run(SwaggerDemoApplication.class, args);
   }
   @Bean
   public Docket productApi() {
      return new Docket(DocumentationType.SWAGGER_2).select()
         .apis(RequestHandlerSelectors.basePackage("com.tutorialspoint.swaggerdemo")).build();
   }
}

Теперь добавьте указанную ниже веб-зависимость Spring Boot Starter в свой файл конфигурации сборки, чтобы записать конечные точки REST, как показано ниже -

Пользователи Maven могут добавить следующую зависимость в ваш файл pom.xml:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Пользователи Gradle могут добавить следующую зависимость в файл build.gradle -

compile('org.springframework.boot:spring-boot-starter-web')

Теперь код для создания двух простых веб-служб RESTful GET и POST в файле Rest Controller показан здесь -

package com.tutorialspoint.swaggerdemo;

import java.util.ArrayList;
import java.util.List;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SwaggerAPIController {
   @RequestMapping(value = "/products", method = RequestMethod.GET)
   public List<String> getProducts() {
      List<String> productsList = new ArrayList<>();
      productsList.add("Honey");
      productsList.add("Almond");
      return productsList;
   }
   @RequestMapping(value = "/products", method = RequestMethod.POST)
   public String createProduct() {
      return "Product is saved successfully";
   }
}

Полный файл конфигурации сборки приведен ниже -

Maven – pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <groupId>com.tutorialspoint</groupId>
   <artifactId>swagger-demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>swagger-demo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.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-web</artifactId>
      </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>

Gradle – build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
} dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
   compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.7.0'
   compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.7.0'
}

Вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью следующих команд Maven или Gradle.

Для Maven вы можете использовать команду, показанную здесь -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle вы можете использовать команду, как показано здесь -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Теперь запустите файл JAR, используя показанную здесь команду -

java –jar <JARFILE>

Теперь приложение запустится на порту 8080 Tomcat, как показано -

Теперь нажмите URL-адрес в своем веб-браузере и посмотрите функциональные возможности Swagger API.

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

Docker - это служба управления контейнерами, которая упрощает сборку и развертывание. Если вы новичок в Docker, вы можете подробно узнать об этом по этой ссылке -https://www.tutorialspoint.com/docker/index.htm

В этой главе мы увидим, как создать образ Docker, используя зависимости Maven и Gradle для вашего приложения Spring Boot.

Создать Dockerfile

Сначала создайте файл с именем Dockerfile по каталогам src/main/dockerс содержанием, показанным ниже. Обратите внимание, что этот файл важен для создания образа Docker.

FROM java:8
VOLUME /tmp
ADD dockerapp-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

Maven

Для Maven добавьте плагин Docker Maven в файл конфигурации сборки. pom.xml

<properties>
   <docker.image.prefix>spring-boot-tutorialspoint</docker.image.prefix>
</properties>

<build>
   <plugins>
      <plugin>
         <groupId>com.spotify</groupId>
         <artifactId>docker-maven-plugin</artifactId>
         <version>1.0.0</version>
         
         <configuration>
            <imageName>${docker.image.prefix}/${project.artifactId}</imageName> <dockerDirectory>src/main/docker</dockerDirectory> <resources> <resource> <directory>${project.build.directory}</directory>
                  <include>${project.build.finalName}.jar</include>
               </resource>
            </resources>
         </configuration>
      </plugin>
      
      <plugin>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
   </plugins>
   
</build>

Полный файл pom.xml приведен ниже -

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>dockerapp</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>dockerapp</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.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>
      <docker.image.prefix>spring-boot-tutorialspoint</docker.image.prefix>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.0.0</version>
            
            <configuration>
               <imageName>${docker.image.prefix}/${project.artifactId}</imageName> <dockerDirectory>src/main/docker</dockerDirectory> <resources> <resource> <directory>${project.build.directory}</directory>
                     <include>${project.build.finalName}.jar</include>
                  </resource>
               </resources>
            </configuration>
         </plugin>
         
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Теперь вы можете запустить свое приложение с помощью команды Maven mvn package docker:build

Note - Включите демон Expose на tcp://localhost:2375 без TLS.

После успешной сборки вы можете увидеть вывод на консоли, как показано ниже -

Теперь просмотрите образы Docker с помощью команды, используя образы докеров, и просмотрите информацию об образе в консоли.

Gradle

Чтобы создать образ Docker с помощью конфигурации сборки Gradle, нам нужно добавить docker плагин и нужно написать задачу buildDocker для создания образа Docker.

Код для настройки Gradle Docker приведен ниже.

buildscript {
   .....
   dependencies {
      .....
      classpath('se.transmode.gradle:gradle-docker:1.2')
   }
}

group = 'spring-boot-tutorialspoint'

.....
apply plugin: 'docker'

task buildDocker(type: Docker, dependsOn: build) {
   applicationName = jar.baseName
   dockerfile = file('src/main/docker/Dockerfile')
   doFirst {
      copy {
         from jar
         into stageDir
      }
   }
}

Полный файл build.gradle приведен ниже.

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
      classpath('se.transmode.gradle:gradle-docker:1.2')
   }
}

group = 'spring-boot-tutorialspoint'

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'docker'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}
task buildDocker(type: Docker, dependsOn: build) {
   applicationName = jar.baseName
   dockerfile = file('src/main/docker/Dockerfile')
   doFirst {
      copy {
         from jar
         into stageDir
      }
   }
}

Теперь создайте образ Docker, используя команду, показанную ниже -

gradle build buildDocker

После выполнения команды вы увидите журнал BUILD SUCCESSFUL в окне консоли.

Теперь просмотрите образы Docker с помощью команды docker images и просмотрите информацию об изображении на консоли.

Большинство разработчиков сталкиваются с трудностями при отслеживании журналов в случае возникновения каких-либо проблем. Это можно решить с помощью Spring Cloud Sleuth и сервера ZipKin для приложения Spring Boot.

Весенний облачный сыщик

Журналы Spring Cloud Sleuth печатаются в следующем формате -

[application-name,traceid,spanid,zipkin-export]

Где,

  • Application-name = Название приложения

  • Traceid = все трассировки запроса и ответа одинаковы при вызове одной и той же службы или одной службы для другой службы.

  • Spanid = Span Id печатается вместе с Trace Id. Идентификатор диапазона отличается для каждого запроса и ответа, вызывающего одну службу для другой службы.

  • Zipkin-export = По умолчанию false. Если это правда, журналы будут экспортированы на сервер Zipkin.

Теперь добавьте зависимость Spring Cloud Starter Sleuth в файл конфигурации сборки следующим образом:

Пользователи Maven могут добавить следующую зависимость в ваш файл pom.xml:

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

Пользователи Gradle могут добавить следующую зависимость в ваш файл build.gradle:

compile('org.springframework.cloud:spring-cloud-starter-sleuth')

Теперь добавьте журналы в файл класса Rest Controller приложения Spring Boot, как показано здесь -

package com.tutorialspoint.sleuthapp;

import java.util.logging.Level;
import java.util.logging.Logger;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class SleuthappApplication {
   private static final Logger LOG = Logger.getLogger(SleuthappApplication.class.getName());
   public static void main(String[] args) {
      SpringApplication.run(SleuthappApplication.class, args);
   }
   @RequestMapping("/")
   public String index() {
      LOG.log(Level.INFO, "Index API is calling");
      return "Welcome Sleuth!";
   }
}

Теперь добавьте имя приложения в файл application.properties, как показано -

spring.application.name = tracinglogs

Полный код для файла конфигурации сборки приведен ниже -

Maven – pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>sleuthapp</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>sleuthapp</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.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>
      <spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-sleuth</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Gradle – build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
ext {
   springCloudVersion = 'Edgware.RELEASE'
}
dependencies {
   compile('org.springframework.cloud:spring-cloud-starter-sleuth')
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}
dependencyManagement {
   imports {
      mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
   }
}

Вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью следующих команд Maven или Gradle.

Для Maven вы можете использовать следующую команду -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle вы можете использовать следующую команду -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Теперь запустите файл JAR, используя показанную здесь команду -

java –jar <JARFILE>

Теперь приложение запущено на порту 8080 Tomcat.

Теперь нажмите URL-адрес в своем веб-браузере и посмотрите результат в журнале консоли.

http://localhost:8080/

Вы можете увидеть следующие журналы в окне консоли. Обратите внимание, что журнал печатается в следующем формате [application-name, traceid, spanid, zipkin-export]

Zipkin Сервер

Zipkin - это приложение, которое отслеживает и управляет журналами Spring Cloud Sleuth вашего приложения Spring Boot. Чтобы построить сервер Zipkin, нам нужно добавить зависимости Zipkin UI и Zipkin Server в наш файл конфигурации сборки.

Пользователи Maven могут добавить следующую зависимость в ваш файл pom.xml:

<dependency>
   <groupId>io.zipkin.java</groupId>
   <artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
   <groupId>io.zipkin.java</groupId>
   <artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>

Пользователи Gradle могут добавить следующую зависимость в ваш файл build.gradle -

compile('io.zipkin.java:zipkin-autoconfigure-ui')
compile('io.zipkin.java:zipkin-server')

Теперь настройте server.port = 9411 в файле свойств приложения.

Для пользователей файла свойств добавьте указанное ниже свойство в файл application.properties.

server.port = 9411

Для пользователей YAML добавьте указанное ниже свойство в файл application.yml.

server:
   port: 9411

Добавьте аннотацию @EnableZipkinServer в свой основной класс приложения Spring Boot. Аннотация @EnableZipkinServer используется для того, чтобы ваше приложение работало как сервер Zipkin.

package com.tutorialspoint.zipkinapp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import zipkin.server.EnableZipkinServer;

@SpringBootApplication
@EnableZipkinServer
public class ZipkinappApplication {
   public static void main(String[] args) {
      SpringApplication.run(ZipkinappApplication.class, args);
   }
}

Код для полного файла конфигурации сборки приведен ниже.

Maven – pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>zipkinapp</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>zipkinapp</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.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>
      <spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>io.zipkin.java</groupId>
         <artifactId>zipkin-server</artifactId>
      </dependency>
      <dependency>
         <groupId>io.zipkin.java</groupId>
         <artifactId>zipkin-autoconfigure-ui</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Gradle – build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' group = 'com.tutorialspoint' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } ext { springCloudVersion = 'Edgware.RELEASE' } dependencies { compile('io.zipkin.java:zipkin-autoconfigure-ui') compile('io.zipkin.java:zipkin-server') testCompile('org.springframework.boot:spring-boot-starter-test') } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
   }
}

Вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью следующих команд Maven или Gradle:

Для Maven используйте команду, приведенную ниже -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle используйте команду, приведенную ниже -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Запустите файл JAR с помощью показанной команды -

java –jar <JARFILE>

Теперь приложение запущено на порту 9411 Tomcat, как показано ниже -

Теперь нажмите URL-адрес ниже и увидите пользовательский интерфейс сервера Zipkin.

http://localhost:9411/zipkin/

Затем добавьте следующую зависимость в приложение клиентской службы и укажите URL-адрес сервера Zipkin, чтобы отслеживать журналы микросервисов через пользовательский интерфейс Zipkin.

Теперь добавьте зависимость Spring Cloud Starter Zipkin в свой файл конфигурации сборки, как показано -

Пользователи Maven могут добавить следующую зависимость в файл pom.xml:

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>

Пользователи Gradle могут добавить следующую зависимость в файл build.gradle -

compile('org.springframework.cloud:spring-cloud-sleuth-zipkin')

Теперь добавьте Always Sampler Bean в приложении Spring Boot для экспорта журналов на сервер Zipkin.

@Bean
public AlwaysSampler defaultSampler() {
   return new AlwaysSampler();
}

Если вы добавите компонент AlwaysSampler, то автоматически значение параметра Spring Sleuth Zipkin Export изменится с false на true.

Затем настройте базовый URL-адрес сервера Zipkin в файле application.properties клиентской службы.

spring.zipkin.baseUrl = http://localhost:9411/zipkin/

Затем укажите идентификатор трассировки и найдите ее в пользовательском интерфейсе Zipkin.

http://localhost:9411/zipkin/traces/{traceid}/

Flyway - это приложение для управления версиями, позволяющее легко и надежно развивать схему вашей базы данных во всех ваших экземплярах. Чтобы узнать больше о Flyway, вы можете воспользоваться ссылкой - www.flywaydb.org

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

В этой главе вы подробно узнаете, как настроить базу данных Flyway в приложении Spring Boot.

Настройка базы данных Flyway

Сначала загрузите проект Spring Boot со страницы Spring Initializer www.start.spring.io и выберите следующие зависимости:

  • Spring Boot Starter Web
  • Flyway
  • MySQL
  • JDBC

Пользователи Maven могут добавить следующие зависимости в файл pom.xml.

<dependency>
   <groupId>org.flywaydb</groupId>
   <artifactId>flyway-core</artifactId>
</dependency>

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
</dependency>

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
</dependency>

Пользователи Gradle могут добавить следующие зависимости в файл build.gradle.

compile('org.flywaydb:flyway-core')
compile('org.springframework.boot:spring-boot-starter-jdbc')
compile('org.springframework.boot:spring-boot-starter-web')
compile('mysql:mysql-connector-java')

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

Для пользователей файла свойств добавьте следующие свойства в файл application.properties.

spring.application.name = flywayapp  

spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/USERSERVICE?autoreconnect=true
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.testOnBorrow = true
spring.datasource.testWhileIdle = true
spring.datasource.timeBetweenEvictionRunsMillis = 60000
spring.datasource.minEvictableIdleTimeMillis = 30000
spring.datasource.validationQuery = SELECT 1
spring.datasource.max-active = 15
spring.datasource.max-idle = 10
spring.datasource.max-wait = 8000

flyway.url = jdbc:mysql://localhost:3306/mysql
flyway.schemas = USERSERVICE
flyway.user = root
flyway.password = root

Пользователи YAML могут добавить следующие свойства в файл application.yml.

spring:
   application:
      name: flywayapp  
   datasource: 
      driverClassName: com.mysql.jdbc.Driver
      url: "jdbc:mysql://localhost:3306/USERSERVICE?autoreconnect=true"
      password: "root"
      username: "root"
      testOnBorrow: true
      testWhileIdle: true
      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 30000
      validationQuery: SELECT 1
      max-active: 15
      max-idle: 10
      max-wait: 8000
flyway:
   url: jdbc:mysql://localhost:3306/mysql
   schemas: USERSERVICE
   user: "root"
   password: "root"

Теперь создайте файл SQL под src/main/resources/db/migrationкаталог. Назовите файл SQL как «V1__Initial.sql».

CREATE TABLE USERS (ID INT AUTO_INCREMENT PRIMARY KEY, USERID VARCHAR(45));
INSERT INTO USERS (ID, USERID) VALUES (1, 'tutorialspoint.com');

Основной код файла класса приложения Spring Boot приведен ниже -

package com.tutorialspoint.flywayapp;

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

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

Полный файл конфигурации сборки представлен ниже.

Maven – pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>flywayapp</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>flywayapp</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.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.flywaydb</groupId>
         <artifactId>flyway-core</artifactId>
      </dependency>
      
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-jdbc</artifactId>
      </dependency>
      
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>

      <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Gradle – build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.flywaydb:flyway-core')
   compile('org.springframework.boot:spring-boot-starter-jdbc')
   compile('org.springframework.boot:spring-boot-starter-web')
   compile('mysql:mysql-connector-java')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

Вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью команд Maven или Gradle, приведенных ниже -

Для Maven вы можете использовать команду, показанную здесь -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle вы можете использовать команду, показанную здесь -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Теперь запустите файл JAR, используя следующую команду -

java –jar <JARFILE>

Теперь Tomcat запустился на порту 8080, и в окне консоли вы можете увидеть журналы базы данных пролетного пути, как показано здесь.

Теперь вы можете перейти к базе данных и выполнить выборочные запросы.

Используя веб-службу Spring Boot RESTful, вы можете отправлять электронные письма с помощью Gmail Transport Layer Security. В этой главе давайте подробно разберемся, как использовать эту функцию.

Во-первых, нам нужно добавить зависимость Spring Boot Starter Mail в ваш файл конфигурации сборки.

Пользователи Maven могут добавить следующую зависимость в файл pom.xml.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

Пользователи Gradle могут добавить следующую зависимость в ваш файл build.gradle.

compile('org.springframework.boot:spring-boot-starter-mail')

Код основного файла класса приложения Spring Boot приведен ниже -

package com.tutorialspoint.emailapp;

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

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

Вы можете написать простой Rest API для отправки по электронной почте в файле класса Rest Controller, как показано.

package com.tutorialspoint.emailapp;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EmailController {
   @RequestMapping(value = "/sendemail")
   public String sendEmail() {
      return "Email sent successfully";
   }   
}

Вы можете написать способ отправки электронного письма с вложением. Определите свойства mail.smtp и используйте PasswordAuthentication.

private void sendmail() throws AddressException, MessagingException, IOException {
   Properties props = new Properties();
   props.put("mail.smtp.auth", "true");
   props.put("mail.smtp.starttls.enable", "true");
   props.put("mail.smtp.host", "smtp.gmail.com");
   props.put("mail.smtp.port", "587");
   
   Session session = Session.getInstance(props, new javax.mail.Authenticator() {
      protected PasswordAuthentication getPasswordAuthentication() {
         return new PasswordAuthentication("[email protected]", "<your password>");
      }
   });
   Message msg = new MimeMessage(session);
   msg.setFrom(new InternetAddress("[email protected]", false));

   msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("[email protected]"));
   msg.setSubject("Tutorials point email");
   msg.setContent("Tutorials point email", "text/html");
   msg.setSentDate(new Date());

   MimeBodyPart messageBodyPart = new MimeBodyPart();
   messageBodyPart.setContent("Tutorials point email", "text/html");

   Multipart multipart = new MimeMultipart();
   multipart.addBodyPart(messageBodyPart);
   MimeBodyPart attachPart = new MimeBodyPart();

   attachPart.attachFile("/var/tmp/image19.png");
   multipart.addBodyPart(attachPart);
   msg.setContent(multipart);
   Transport.send(msg);   
}

Теперь вызовите указанный выше метод sendmail () из Rest API, как показано:

@RequestMapping(value = "/sendemail")
public String sendEmail() throws AddressException, MessagingException, IOException {
   sendmail();
   return "Email sent successfully";   
}

Note - Перед отправкой электронной почты включите параметр «Разрешить менее безопасные приложения» в настройках учетной записи Gmail.

Полный файл конфигурации сборки представлен ниже.

Maven – pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>emailapp</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>emailapp</name>
   <description>Demo project for Spring Boot</description>
   
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.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-web</artifactId>
      </dependency>
      
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-mail</artifactId>
      </dependency>
      
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter</artifactId>
      </dependency>
      
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>
   
   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build> 
   
</project>

Gradle – build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
   compile('org.springframework.boot:spring-boot-starter-mail')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

Теперь вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью команд Maven или Gradle, показанных ниже -

Для Maven вы можете использовать команду, как показано -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle вы можете использовать команду, как показано -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Теперь запустите файл JAR с помощью команды, приведенной ниже -

java –jar <JARFILE>

Вы можете видеть, что приложение запущено на порту 8080 Tomcat.

Теперь нажмите следующий URL-адрес в своем веб-браузере, и вы получите электронное письмо.

http://localhost:8080/sendemail

Hystrix - это библиотека от Netflix. Hystrix изолирует точки доступа между службами, предотвращает каскадные отказы между ними и предоставляет варианты восстановления.

Например, когда вы вызываете 3 - е приложение партии, это занимает больше времени , чтобы отправить ответ. Таким образом, в это время элемент управления переходит к резервному методу и возвращает пользовательский ответ вашему приложению.

В этой главе вы увидите, как реализовать Hystrix в приложении Spring Boot.

Во-первых, нам нужно добавить зависимость Spring Cloud Starter Hystrix в наш файл конфигурации сборки.

Пользователи Maven могут добавить следующую зависимость в файл pom.xml:

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

Пользователи Gradle могут добавить следующую зависимость в файл build.gradle:

compile('org.springframework.cloud:spring-cloud-starter-hystrix')

Теперь добавьте аннотацию @EnableHystrix в ваш основной файл класса приложения Spring Boot. Аннотация @EnableHystrix используется для включения функций Hystrix в ваше приложение Spring Boot.

Основной код файла класса приложения Spring Boot приведен ниже -

package com.tutorialspoint.hystrixapp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;

@SpringBootApplication
@EnableHystrix
public class HystrixappApplication {
   public static void main(String[] args) {
      SpringApplication.run(HystrixappApplication.class, args);
   }
}

Теперь напишите простой Rest Controller, чтобы он возвращал строку через 3 секунды после запрошенного времени.

@RequestMapping(value = "/")
public String hello() throws InterruptedException {
   Thread.sleep(3000);
   return "Welcome Hystrix";
}

Теперь добавьте команду @Hystrix и @HystrixProperty для Rest API и определите время ожидания в миллисекундах.

@HystrixCommand(fallbackMethod = "fallback_hello", commandProperties = {
   @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
})

Затем определите резервный метод fallback_hello (), если на запрос требуется много времени для ответа.

private String fallback_hello() {
   return "Request fails. It takes long time to response";
}

Полный файл класса Rest Controller, содержащий свойства REST API и Hystrix, показан здесь -

@RequestMapping(value = "/")
@HystrixCommand(fallbackMethod = "fallback_hello", commandProperties = {
   @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
})
public String hello() throws InterruptedException {
   Thread.sleep(3000);
   return "Welcome Hystrix";
}
private String fallback_hello() {
   return "Request fails. It takes long time to response";
}

В этом примере REST API записан в самом файле класса приложения Spring Boot.

package com.tutorialspoint.hystrixapp;

import org.springframework.boot.SpringApplication;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;

@SpringBootApplication
@EnableHystrix
@RestController
public class HystrixappApplication {
   public static void main(String[] args) {
      SpringApplication.run(HystrixappApplication.class, args);
   }
   @RequestMapping(value = "/")
   @HystrixCommand(fallbackMethod = "fallback_hello", commandProperties = {
      @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
   })
   public String hello() throws InterruptedException {
      Thread.sleep(3000);
      return "Welcome Hystrix";
   }
   private String fallback_hello() {
      return "Request fails. It takes long time to response";
   }
}

Полный файл конфигурации сборки представлен ниже.

Maven – pom.xml file

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>hystrixapp</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>hystrixapp</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.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>
      <spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-hystrix</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Gradle – build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
ext {
   springCloudVersion = 'Edgware.RELEASE'
}
dependencies {
   compile('org.springframework.cloud:spring-cloud-starter-hystrix')
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}
dependencyManagement {
   imports {
      mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
   }
}

Вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью следующих команд Maven или Gradle:

Для Maven используйте команду, как показано -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle используйте команду, как показано -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Теперь запустите файл JAR с помощью команды, приведенной ниже -

java –jar <JARFILE>

Это запустит приложение на порту 8080 Tomcat, как показано ниже -

Теперь нажмите URL-адрес http://localhost:8080/в браузере и просмотрите ответ Hystrix. На ответ API требуется 3 секунды, но таймаут Hystrix составляет 1 секунду.

В этой главе давайте поймем, как создать интерактивное веб-приложение с помощью Spring Boot с веб-сокетами.

Чтобы создать интерактивное веб-приложение в Spring Boot с веб-сокетом, вам необходимо добавить следующие зависимости.

Пользователи Maven должны добавить следующие зависимости в файл pom.xml.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
   <groupId>org.webjars</groupId>
   <artifactId>webjars-locator</artifactId>
</dependency>
<dependency>
   <groupId>org.webjars</groupId>
   <artifactId>sockjs-client</artifactId>
   <version>1.0.2</version>
</dependency>

<dependency>
   <groupId>org.webjars</groupId>
   <artifactId>stomp-websocket</artifactId>
   <version>2.3.3</version>
</dependency>
<dependency>
   <groupId>org.webjars</groupId>
   <artifactId>bootstrap</artifactId>
   <version>3.3.7</version>        </dependency>
<dependency>
   <groupId>org.webjars</groupId>
   <artifactId>jquery</artifactId>
   <version>3.1.0</version>
</dependency>

Пользователи Gradle могут добавить следующие зависимости в ваш файл build.gradle:

compile("org.springframework.boot:spring-boot-starter-websocket")
compile("org.webjars:webjars-locator")
compile("org.webjars:sockjs-client:1.0.2")
compile("org.webjars:stomp-websocket:2.3.3")
compile("org.webjars:bootstrap:3.3.7")
compile("org.webjars:jquery:3.1.0")

Давайте создадим контроллер обработки сообщений для работы с сообщениями STOMP. Сообщения STOMP могут быть перенаправлены в файл класса @Controller. Например, GreetingController отображается для обработки сообщений адресату «/ hello».

package com.tutorialspoint.websocketapp;

import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

@Controller
public class GreetingController {
   @MessageMapping("/hello")
   @SendTo("/topic/greetings")
   public Greeting greeting(HelloMessage message) throws Exception {
      Thread.sleep(1000); // simulated delay
      return new Greeting("Hello, " + message.getName() + "!");
   }
}

Теперь настройте Spring для обмена сообщениями STOMP. Напишите файл класса WebSocketConfig, расширяющий класс AbstractWebSocketMessageBrokerConfigurer, как показано ниже.

package com.tutorialspoint.websocketapp;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
   @Override
   public void configureMessageBroker(MessageBrokerRegistry config) {
      config.enableSimpleBroker("/topic");
      config.setApplicationDestinationPrefixes("/app");
   }
   @Override
   public void registerStompEndpoints(StompEndpointRegistry registry) {
      registry.addEndpoint("/tutorialspoint-websocket").withSockJS();
   }
}

Аннотация @EnableWebSocketMessageBroker используется для настройки брокера сообщений веб-сокета для создания конечных точек STOMP.

Вы можете создать клиентский файл браузера в каталоге src / main / resources / static / index.html, как показано -

<!DOCTYPE html>
<html>
   <head>
      <title>Hello WebSocket</title>
      <link href = "/webjars/bootstrap/css/bootstrap.min.css" rel = "stylesheet">
      <link href = "/main.css" rel = "stylesheet">
      <script src = "/webjars/jquery/jquery.min.js"></script>
      <script src = "/webjars/sockjs-client/sockjs.min.js"></script>
      <script src = "/webjars/stomp-websocket/stomp.min.js"></script>
      <script src = "/app.js"></script>
   </head>
   
   <body>
      <noscript>
         <h2 style = "color: #ff0000">
            Seems your browser doesn't support Javascript! Websocket relies on Javascript being
            enabled. Please enable Javascript and reload this page!
         </h2>
      </noscript>
      <div id = "main-content" class = "container">
         <div class = "row">
            <div class = "col-md-6">
               <form class = "form-inline">
                  <div class = "form-group">
                     <label for = "connect">WebSocket connection:</label>
                     <button id = "connect" class = "btn btn-default" type = "submit">Connect</button>
                     <button id = "disconnect" class = "btn btn-default" type = "submit" disabled = "disabled">Disconnect
                     </button>
                  </div>
               </form>
            </div>
            
            <div class = "col-md-6">
               <form class = "form-inline">
                  <div class = "form-group">
                     <label for = "name">What is your name?</label>
                     <input type = "text" id = "name" class = "form-control" placeholder = "Your name here...">
                  </div>
                  <button id = "send" class = "btn btn-default" type = "submit">Send</button>
               </form>
            </div>
         </div>
         
         <div class  =  "row">
            <div class  =  "col-md-12">
               <table id  =  "conversation" class = "table table-striped">
                  <thead>
                     <tr>
                        <th>Greetings</th>
                     </tr>
                  </thead>
                  <tbody id  =  "greetings"></tbody>
               </table>
            </div>
         </div>
      </div>
   </body>
</html>

Давайте создадим файл app.js для использования и создания сообщений с помощью STOMP.

var stompClient = null;

function setConnected(connected) {
   $("#connect").prop("disabled", connected);
   $("#disconnect").prop("disabled", !connected); if (connected) { $("#conversation").show();
   } else {
      $("#conversation").hide(); } $("#greetings").html("");
}

function connect() {
   var socket = new SockJS('/tutorialspoint-websocket');
   stompClient = Stomp.over(socket);
   stompClient.connect({}, function (frame) {
      setConnected(true);
      console.log('Connected: ' + frame);
      stompClient.subscribe('/topic/greetings', function (greeting) {
         showGreeting(JSON.parse(greeting.body).content);
      });
   });
}
function disconnect() {
   if (stompClient !== null) {
      stompClient.disconnect();
   }
   setConnected(false);
   console.log("Disconnected");
}
function sendName() {
   stompClient.send("/app/hello", {}, JSON.stringify({'name': $("#name").val()})); } function showGreeting(message) { $("#greetings").append("<tr><td>" + message + "</td></tr>");
}
$(function () { $( "form" ).on('submit', function (e) {e.preventDefault();});
   $( "#connect" ).click(function() { connect(); }); $( "#disconnect" ).click(function() { disconnect(); });
   $( "#send" ).click(function() { sendName(); });
});

Код для основного приложения Spring Boot показан ниже.

package com.tutorialspoint.websocketapp;

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

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

Полный файл конфигурации сборки представлен ниже.

Maven – pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>websocketapp</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>websocketapp</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.RELEASE</version>
   </parent>

   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-websocket</artifactId>
      </dependency>
      <dependency>
         <groupId>org.webjars</groupId>
         <artifactId>webjars-locator</artifactId>
      </dependency>
      <dependency>
         <groupId>org.webjars</groupId>
         <artifactId>sockjs-client</artifactId>
         <version>1.0.2</version>
      </dependency>
      
      <dependency>
         <groupId>org.webjars</groupId>
         <artifactId>stomp-websocket</artifactId>
         <version>2.3.3</version>
      </dependency>
      <dependency>
         <groupId>org.webjars</groupId>
         <artifactId>bootstrap</artifactId>
         <version>3.3.7</version>
      </dependency>
      
      <dependency>
         <groupId>org.webjars</groupId>
         <artifactId>jquery</artifactId>
         <version>3.1.0</version>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>
   
   <properties>
      <java.version>1.8</java.version>
   </properties>
   
   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Gradle – build.gradle

buildscript {
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.9.RELEASE")
   }
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

jar {
   baseName = 'websocketapp'
   version =  '0.1.0'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile("org.springframework.boot:spring-boot-starter-websocket")
   compile("org.webjars:webjars-locator")
   compile("org.webjars:sockjs-client:1.0.2")
   compile("org.webjars:stomp-websocket:2.3.3")
   compile("org.webjars:bootstrap:3.3.7")
   compile("org.webjars:jquery:3.1.0")

   testCompile("org.springframework.boot:spring-boot-starter-test")
}

Вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью команд Maven или Gradle, как показано ниже -

Для Maven вы можете использовать команду, приведенную ниже -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle вы можете использовать команду, как показано -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Запустите файл JAR, используя приведенную здесь команду -

java –jar <JARFILE>

Теперь приложение запущено на порту 8080 Tomcat, как показано.

Теперь нажмите URL-адрес http://localhost:8080/ в своем веб-браузере, подключите веб-сокет и отправьте приветствие и получите сообщение.

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

Давайте рассмотрим пример, в котором мы собираемся сохранить содержимое файла CSV в HSQLDB.

Чтобы создать программу пакетной службы, нам нужно добавить зависимость Spring Boot Starter Batch и зависимость HSQLDB в наш файл конфигурации сборки.

Пользователи Maven могут добавить следующие зависимости в файл pom.xml.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
   <groupId>org.hsqldb</groupId>
   <artifactId>hsqldb</artifactId>
</dependency>

Пользователи Gradle могут добавить следующие зависимости в файл build.gradle.

compile("org.springframework.boot:spring-boot-starter-batch")
compile("org.hsqldb:hsqldb")

Теперь добавьте простой файл данных CSV в ресурсы пути к классам - src / main / resources и назовите файл как file.csv, как показано -

William,John
Mike, Sebastian
Lawarance, Lime

Затем напишите сценарий SQL для HSQLDB - в каталоге ресурсов пути к классам - request_fail_hystrix_timeout

DROP TABLE USERS IF EXISTS;
CREATE TABLE USERS  (
   user_id BIGINT IDENTITY NOT NULL PRIMARY KEY,
   first_name VARCHAR(20),
   last_name VARCHAR(20)
);

Создайте класс POJO для модели USERS, как показано -

package com.tutorialspoint.batchservicedemo;
public class User {
   private String lastName;
   private String firstName;

   public User() {
   }
   public User(String firstName, String lastName) {
      this.firstName = firstName;
      this.lastName = lastName;
   }
   public void setFirstName(String firstName) {
      this.firstName = firstName;
   }
   public String getFirstName() {
      return firstName;
   }
   public String getLastName() {
      return lastName;
   }
   public void setLastName(String lastName) {
      this.lastName = lastName;
   }

   @Override
   public String toString() {
      return "firstName: " + firstName + ", lastName: " + lastName;
   }   
}

Теперь создайте промежуточный процессор для выполнения операций после чтения данных из файла CSV и перед записью данных в SQL.

package com.tutorialspoint.batchservicedemo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.item.ItemProcessor;

public class UserItemProcessor implements ItemProcessor<User, User> {
   private static final Logger log = LoggerFactory.getLogger(UserItemProcessor.class);

   @Override
   public User process(final User user) throws Exception {
      final String firstName = user.getFirstName().toUpperCase();
      final String lastName = user.getLastName().toUpperCase();
      final User transformedPerson = new User(firstName, lastName);

      log.info("Converting (" + user + ") into (" + transformedPerson + ")");
      return transformedPerson;
   }
}

Давайте создадим файл конфигурации пакетной службы, чтобы прочитать данные из CSV и записать в файл SQL, как показано ниже. Нам нужно добавить аннотацию @EnableBatchProcessing в файл класса конфигурации. Аннотация @EnableBatchProcessing используется для включения пакетных операций для вашего приложения Spring Boot.

package com.tutorialspoint.batchservicedemo;

import javax.sql.DataSource;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;

import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider;
import org.springframework.batch.item.database.JdbcBatchItemWriter;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.batch.item.file.mapping.DefaultLineMapper;
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
   @Autowired
   public JobBuilderFactory jobBuilderFactory;

   @Autowired
   public StepBuilderFactory stepBuilderFactory;

   @Autowired
   public DataSource dataSource;

   @Bean
   public FlatFileItemReader<User> reader() {
      FlatFileItemReader<User> reader = new FlatFileItemReader<User>();
      reader.setResource(new ClassPathResource("file.csv"));
      reader.setLineMapper(new DefaultLineMapper<User>() {
         {
            setLineTokenizer(new DelimitedLineTokenizer() {
               {
                  setNames(new String[] { "firstName", "lastName" });
               }
            });
            setFieldSetMapper(new BeanWrapperFieldSetMapper<User>() {
               {
                  setTargetType(User.class);
               }
            });
         }
      });
      return reader;
   }
   @Bean
   public UserItemProcessor processor() {
      return new UserItemProcessor();
   }
   @Bean
   public JdbcBatchItemWriter<User> writer() {
      JdbcBatchItemWriter<User> writer = new JdbcBatchItemWriter<User>();
      writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<User>());
      writer.setSql("INSERT INTO USERS (first_name, last_name) VALUES (:firstName, :lastName)");
      writer.setDataSource(dataSource);
      return writer;
   }
   @Bean
   public Job importUserJob(JobCompletionNotificationListener listener) {
      return jobBuilderFactory.get("importUserJob").incrementer(
         new RunIdIncrementer()).listener(listener).flow(step1()).end().build();
   }
   @Bean
   public Step step1() {
      return stepBuilderFactory.get("step1").<User, User>chunk(10).reader(reader()).processor(processor()).writer(writer()).build();
   }
}

В reader() используется для чтения данных из файла CSV, а метод writer () используется для записи данных в SQL.

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

package com.tutorialspoint.batchservicedemo;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.listener.JobExecutionListenerSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Component;

@Component
public class JobCompletionNotificationListener extends JobExecutionListenerSupport {
   private static final Logger log = LoggerFactory.getLogger(JobCompletionNotificationListener.class);
   private final JdbcTemplate jdbcTemplate;

   @Autowired
   public JobCompletionNotificationListener(JdbcTemplate jdbcTemplate) {
      this.jdbcTemplate = jdbcTemplate;
   }
   @Override
   public void afterJob(JobExecution jobExecution) {
      if (jobExecution.getStatus() == BatchStatus.COMPLETED) {
         log.info("!!! JOB FINISHED !! It's time to verify the results!!");

         List<User> results = jdbcTemplate.query(
            "SELECT first_name, last_name FROM USERS", new RowMapper<User>() {
            
            @Override
            public User mapRow(ResultSet rs, int row) throws SQLException {
               return new User(rs.getString(1), rs.getString(2));
            }
         });

         for (User person : results) {
            log.info("Found <" + person + "> in the database.");
         }
      }
   }
}

Теперь создайте исполняемый файл JAR и запустите приложение Spring Boot, используя следующие команды Maven или Gradle.

Для Maven используйте команду, как показано -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle вы можете использовать команду, как показано -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Запустите файл JAR, используя приведенную здесь команду -

java –jar <JARFILE>

Вы можете увидеть вывод в окне консоли, как показано -

Apache Kafka - это проект с открытым исходным кодом, используемый для публикации и подписки на сообщения на основе отказоустойчивой системы обмена сообщениями. Он быстрый, масштабируемый и распространяется по дизайну. Если вы новичок в Kafka или хотите лучше понять его, перейдите по этой ссылке - www.tutorialspoint.com/apache_kafka/

В этой главе мы увидим, как реализовать Apache Kafka в приложении Spring Boot.

Во-первых, нам нужно добавить зависимость Spring Kafka в наш файл конфигурации сборки.

Пользователи Maven могут добавить следующую зависимость в файл pom.xml.

<dependency>
   <groupId>org.springframework.kafka</groupId>
   <artifactId>spring-kafka</artifactId>
   <version>2.1.0.RELEASE</version>
</dependency>

Пользователи Gradle могут добавить следующую зависимость в файл build.gradle.

compile group: 'org.springframework.kafka', name: 'spring-kafka', version: '2.1.0.RELEASE'

Создание сообщений

Чтобы создавать сообщения в Apache Kafka, нам нужно определить класс Configuration для конфигурации Producer, как показано:

package com.tutorialspoint.kafkademo;

import java.util.HashMap;
import java.util.Map;

import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;

@Configuration
public class KafkaProducerConfig {
   @Bean
   public ProducerFactory<String, String> producerFactory() {
      Map<String, Object> configProps = new HashMap<>();
      configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
      configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
      configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
      return new DefaultKafkaProducerFactory<>(configProps);
   }
   @Bean
   public KafkaTemplate<String, String> kafkaTemplate() {
      return new KafkaTemplate<>(producerFactory());
   }
}

Чтобы опубликовать сообщение, автоматически подключите объект шаблона Kafka и создайте сообщение, как показано.

@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
 
public void sendMessage(String msg) {
   kafkaTemplate.send(topicName, msg);
}

Потребление сообщения

Чтобы получать сообщения, нам нужно написать файл класса конфигурации Consumer, как показано ниже.

package com.tutorialspoint.kafkademo;

import java.util.HashMap;
import java.util.Map;

import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.EnableKafka;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaConsumerFactory;

@EnableKafka
@Configuration
public class KafkaConsumerConfig {
   @Bean
   public ConsumerFactory<String, String> consumerFactory() {
      Map<String, Object> props = new HashMap<>();
      props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:2181");
      props.put(ConsumerConfig.GROUP_ID_CONFIG, "group-id");
      props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
      props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
      return new DefaultKafkaConsumerFactory<>(props);
   }
   @Bean
   public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {
      ConcurrentKafkaListenerContainerFactory<String, String> 
      factory = new ConcurrentKafkaListenerContainerFactory<>();
      factory.setConsumerFactory(consumerFactory());
      return factory;
   }
}

Затем напишите Listener для прослушивания сообщений.

@KafkaListener(topics = "tutorialspoint", groupId = "group-id")
public void listen(String message) {
   System.out.println("Received Messasge in group - group-id: " + message);
}

Давайте вызовем метод sendMessage () из метода запуска класса ApplicationRunner из основного файла класса приложения Spring Boot и получим сообщение из того же файла класса.

Ваш основной код файла класса приложения Spring Boot приведен ниже -

package com.tutorialspoint.kafkademo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.core.KafkaTemplate;

@SpringBootApplication
public class KafkaDemoApplication implements ApplicationRunner {
   @Autowired
   private KafkaTemplate<String, String> kafkaTemplate;

   public void sendMessage(String msg) {
      kafkaTemplate.send("tutorialspoint", msg);
   }
   public static void main(String[] args) {
      SpringApplication.run(KafkaDemoApplication.class, args);
   }
   @KafkaListener(topics = "tutorialspoint", groupId = "group-id")
   public void listen(String message) {
      System.out.println("Received Messasge in group - group-id: " + message);
   }
   @Override
   public void run(ApplicationArguments args) throws Exception {
      sendMessage("Hi Welcome to Spring For Apache Kafka");
   }
}

Код для полного файла конфигурации сборки приведен ниже.

Maven – pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>kafka-demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>kafka-demo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.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</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.kafka</groupId>
         <artifactId>spring-kafka</artifactId>
         <version>2.1.0.RELEASE</version>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Gradle – build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter')
   compile group: 'org.springframework.kafka', name: 'spring-kafka', version: '2.1.0.RELEASE'
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

Теперь создайте исполняемый файл JAR и запустите приложение Spring Boot, используя приведенные ниже команды Maven или Gradle, как показано:

Для Maven используйте команду, как показано -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle используйте команду, как показано -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Запустите файл JAR, используя приведенную здесь команду -

java –jar <JARFILE>

Вы можете увидеть результат в окне консоли.

Twilio является 3 - е приложение партии используется для отправки SMS и совершать голосовые звонки с нашего приложения. Это позволяет нам программно отправлять SMS и совершать голосовые вызовы.

В этой главе вы узнаете, как реализовать отправку SMS и выполнение голосовых вызовов с помощью Spring Boot с Twilio.

Note- Мы использовали учетную запись Trail в Twilio для отправки SMS и голосовых вызовов. Вы можете узнать больше о Twilio на сайте www.twilio.com .

Во-первых, нам нужно добавить зависимость Twilio в наш файл конфигурации сборки.

Пользователи Maven могут добавить следующую зависимость в файл pom.xml.

<dependency>
   <groupId>com.twilio.sdk</groupId>
   <artifactId>twilio</artifactId>
   <version>7.16.1</version>
</dependency>

Пользователи Gradle могут добавить следующую зависимость в файл build.gradle.

compile group: "com.twilio.sdk", name:"twilio", version: "7.16.1"

Теперь инициализируйте учетную запись Twilio с помощью ACCOUNT_SID и AUTH_ID в статическом блоке, как показано -

static {
   Twilio.init(ACCOUNT_SID, AUTH_ID);
}

Отправка СМС

Чтобы отправить SMS, нам нужно предоставить номер отправителя и номер получателя методу Message.create (). Содержимое тела сообщения также необходимо предоставить для метода Message.creator (), как показано -

Message.creator(new PhoneNumber("to-number"), new PhoneNumber("from-number"),
   "Message from Spring Boot Application").create();

Основной файл класса приложения Spring Boot выглядит ниже.

package com.tutorialspoint.smsdemo;

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

import com.twilio.Twilio;
import com.twilio.rest.api.v2010.account.Message;
import com.twilio.type.PhoneNumber;

@SpringBootApplication
public class SmsdemoApplication implements ApplicationRunner {
   private final static String ACCOUNT_SID = "<your-account-sid>";
   private final static String AUTH_ID = "<your-auth-id>";

   static {
      Twilio.init(ACCOUNT_SID, AUTH_ID);
   }
   public static void main(String[] args) {
      SpringApplication.run(SmsdemoApplication.class, args);
   }
   @Override
   public void run(ApplicationArguments arg0) throws Exception {
      Message.creator(new PhoneNumber("to-number"), new PhoneNumber("from-number"),
         "Message from Spring Boot Application").create();
   }
}

Полный код для создания файла конфигурации приведен ниже -

Maven – pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>smsdemo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>smsdemo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.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</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>com.twilio.sdk</groupId>
         <artifactId>twilio</artifactId>
         <version>7.16.1</version>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Gradle – build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter')
   testCompile('org.springframework.boot:spring-boot-starter-test')
   compile group: "com.twilio.sdk", name:"twilio", version: "7.11.+"   
}

Вы можете создать исполняемый файл JAR и запустить приложение весенней загрузки с помощью следующих команд Maven или Gradle:

Для Maven используйте команду, как показано -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle используйте команду, как показано -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Запустите файл JAR, используя команду, указанную ниже -

java –jar <JARFILE>

Теперь вы получите SMS на свой «номер».

Сообщение получено на «номер».

Sent from your Twilio trail account
- Message from Spring Boot Application

Note- В этом примере мы использовали учетную запись Trail. Таким образом, вы должны проверить номера перед отправкой SMS.

Голосовые звонки

Чтобы совершать голосовые вызовы с помощью Twilio, нам нужно вызвать метод Call.creator (). Для этого метода нам нужно предоставить номер получателя, номер отправителя и голосовую заметку, как показано здесь.

Call.creator(new PhoneNumber("<to-number>"), new PhoneNumber("<from-number>"),
   new URI("http://demo.twilio.com/docs/voice.xml")).create();

Код для основного файла класса приложения Spring Boot приведен ниже.

package com.tutorialspoint.smsdemo; 

import java.net.URI;

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

import com.twilio.Twilio;
import com.twilio.rest.api.v2010.account.Call;
import com.twilio.type.PhoneNumber;

@SpringBootApplication
public class SmsdemoApplication implements ApplicationRunner {
   private final static String ACCOUNT_SID = "<ACCOUNT-SID>";
   private final static String AUTH_ID = "AUTH-ID";

   static {
      Twilio.init(ACCOUNT_SID, AUTH_ID);
   }
   public static void main(String[] args) {
      SpringApplication.run(SmsdemoApplication.class, args);
   }
   @Override
   public void run(ApplicationArguments arg0) throws Exception {
      Call.creator(new PhoneNumber("<to-number>"), new PhoneNumber("<from-number>"),
         new URI("http://demo.twilio.com/docs/voice.xml")).create();
   }
}

Код для полного файла конфигурации сборки приведен ниже -

Maven – pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>smsdemo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>smsdemo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.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</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>com.twilio.sdk</groupId>
         <artifactId>twilio</artifactId>
         <version>7.16.1</version>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Gradle – build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter')
   testCompile('org.springframework.boot:spring-boot-starter-test')
   compile group: "com.twilio.sdk", name:"twilio", version: "7.11.+"   
}

Вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью следующих команд Maven или Gradle.

Для Maven используйте команду, как показано -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle используйте команду, как показано -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Теперь запустите файл JAR, используя приведенную здесь команду -

java –jar <JARFILE>

Теперь вы получите звонок на ваш «номер» из Twilio.

После посещения разговора нажмите любую клавишу, вы услышите голосовую заметку от https://demo.twilio.com/docs/voice.xml

Note- В этом примере мы использовали учетную запись Trail. Таким образом, вам следует проверить номера перед звонками.

Модульное тестирование - это одно из тестов, проводимых разработчиками, чтобы убедиться, что функции отдельных модулей или компонентов работают нормально.

В этом руководстве мы увидим, как написать пример модульного теста с помощью Mockito и Web Controller.

Mockito

Для внедрения Mockito Mocks в Spring Beans нам нужно добавить зависимость Mockito-core в наш файл конфигурации сборки.

Пользователи Maven могут добавить следующую зависимость в ваш файл pom.xml.

<dependency>
   <groupId>org.mockito</groupId>
   <artifactId>mockito-core</artifactId>
   <version>2.13.0</version>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
</dependency>

Пользователи Gradle могут добавить следующую зависимость в файл build.gradle.

compile group: 'org.mockito', name: 'mockito-core', version: '2.13.0'
testCompile('org.springframework.boot:spring-boot-starter-test')

Здесь приведен код для записи класса Service, который содержит метод, возвращающий значение String.

package com.tutorialspoint.mockitodemo;

import org.springframework.stereotype.Service;

@Service
public class ProductService {
   public String getProductName() {
      return "Honey";
   } 
}

Теперь вставьте класс ProductService в другой файл класса Service, как показано.

package com.tutorialspoint.mockitodemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class OrderService {
   @Autowired
   ProductService productService;

   public OrderService(ProductService productService) {
      this.productService = productService;
   }
   public String getProductName() {
      return productService.getProductName();
   }
}

Основной файл класса приложения Spring Boot приведен ниже -

package com.tutorialspoint.mockitodemo;

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

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

Затем настройте контекст приложения для тестов. Аннотация @Profile («тест») используется для настройки класса при выполнении тестовых случаев.

package com.tutorialspoint.mockitodemo;

import org.mockito.Mockito;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Profile;

@Profile("test")
@Configuration
public class ProductServiceTestConfiguration {
   @Bean
   @Primary
   public ProductService productService() {
      return Mockito.mock(ProductService.class);
   }
}

Теперь вы можете написать пример модульного теста для службы заказов в разделе src/test/resources пакет.

package com.tutorialspoint.mockitodemo;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@SpringBootTest
@ActiveProfiles("test")
@RunWith(SpringJUnit4ClassRunner.class)
public class MockitoDemoApplicationTests {
   @Autowired
   private OrderService orderService;
   
   @Autowired
   private ProductService productService;

   @Test
   public void whenUserIdIsProvided_thenRetrievedNameIsCorrect() {
      Mockito.when(productService.getProductName()).thenReturn("Mock Product Name");
      String testName = orderService.getProductName();
      Assert.assertEquals("Mock Product Name", testName);
   }
}

Полный код файла конфигурации сборки приведен ниже.

Maven – pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>mockito-demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>mockito-demo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.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</artifactId>
      </dependency>
      <dependency>
         <groupId>org.mockito</groupId>
         <artifactId>mockito-core</artifactId>
         <version>2.13.0</version>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Gradle – build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter')
   compile group: 'org.mockito', name: 'mockito-core', version: '2.13.0'
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

Вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью следующих команд Maven или Gradle1.

Для Maven вы можете использовать команду, как показано -

mvn clean install

Вы можете увидеть результаты теста в окне консоли.

Для Gradle вы можете использовать команду, как показано -

gradle clean build

Остальные результаты вы можете увидеть в окне консоли.

Spring Boot предоставляет простой способ написать файл Unit Test для файла Rest Controller. С помощью SpringJUnit4ClassRunner и MockMvc мы можем создать контекст веб-приложения для написания файла Unit Test для Rest Controller.

Модульные тесты следует писать под src/test/java ресурсы каталога и пути к классам для написания теста должны быть помещены в src/test/resources каталог.

Для написания модульного теста нам нужно добавить зависимость Spring Boot Starter Test в ваш файл конфигурации сборки, как показано ниже.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
</dependency>

Пользователи Gradle могут добавить следующую зависимость в ваш файл build.gradle.

testCompile('org.springframework.boot:spring-boot-starter-test')

Перед написанием тестового примера мы должны сначала создать веб-службы RESTful. Для получения дополнительной информации о создании веб-служб RESTful обратитесь к соответствующей главе в этом руководстве.

Написание модульного теста для контроллера REST

В этом разделе давайте посмотрим, как написать модульный тест для контроллера REST.

Во-первых, нам нужно создать файл абстрактного класса, используемый для создания контекста веб-приложения с помощью MockMvc, и определить методы mapToJson () и mapFromJson () для преобразования объекта Java в строку JSON и преобразования строки JSON в объект Java.

package com.tutorialspoint.demo;

import java.io.IOException;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = DemoApplication.class)
@WebAppConfiguration
public abstract class AbstractTest {
   protected MockMvc mvc;
   @Autowired
   WebApplicationContext webApplicationContext;

   protected void setUp() {
      mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
   }
   protected String mapToJson(Object obj) throws JsonProcessingException {
      ObjectMapper objectMapper = new ObjectMapper();
      return objectMapper.writeValueAsString(obj);
   }
   protected <T> T mapFromJson(String json, Class<T> clazz)
      throws JsonParseException, JsonMappingException, IOException {
      
      ObjectMapper objectMapper = new ObjectMapper();
      return objectMapper.readValue(json, clazz);
   }
}

Затем напишите файл класса, который расширяет класс AbstractTest, и напишите модульный тест для каждого метода, такого как GET, POST, PUT и DELETE.

Код для тестового примера GET API приведен ниже. Этот API предназначен для просмотра списка продуктов.

@Test
public void getProductsList() throws Exception {
   String uri = "/products";
   MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.get(uri)
      .accept(MediaType.APPLICATION_JSON_VALUE)).andReturn();
   
   int status = mvcResult.getResponse().getStatus();
   assertEquals(200, status);
   String content = mvcResult.getResponse().getContentAsString();
   Product[] productlist = super.mapFromJson(content, Product[].class);
   assertTrue(productlist.length > 0);
}

Код для тестового примера POST API приведен ниже. Этот API предназначен для создания продукта.

@Test
public void createProduct() throws Exception {
   String uri = "/products";
   Product product = new Product();
   product.setId("3");
   product.setName("Ginger");
   
   String inputJson = super.mapToJson(product);
   MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post(uri)
      .contentType(MediaType.APPLICATION_JSON_VALUE).content(inputJson)).andReturn();
   
   int status = mvcResult.getResponse().getStatus();
   assertEquals(201, status);
   String content = mvcResult.getResponse().getContentAsString();
   assertEquals(content, "Product is created successfully");
}

Код для тестового примера PUT API приведен ниже. Этот API предназначен для обновления существующего продукта.

@Test
public void updateProduct() throws Exception {
   String uri = "/products/2";
   Product product = new Product();
   product.setName("Lemon");
   
   String inputJson = super.mapToJson(product);
   MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.put(uri)
      .contentType(MediaType.APPLICATION_JSON_VALUE).content(inputJson)).andReturn();
   
   int status = mvcResult.getResponse().getStatus();
   assertEquals(200, status);
   String content = mvcResult.getResponse().getContentAsString();
   assertEquals(content, "Product is updated successsfully");
}

Код для тестового примера удаления API приведен ниже. Этот API удалит существующий продукт.

@Test
public void deleteProduct() throws Exception {
   String uri = "/products/2";
   MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.delete(uri)).andReturn();
   int status = mvcResult.getResponse().getStatus();
   assertEquals(200, status);
   String content = mvcResult.getResponse().getContentAsString();
   assertEquals(content, "Product is deleted successsfully");
}

Полный файл класса тестирования контроллера приведен ниже -

package com.tutorialspoint.demo;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import org.junit.Before;
import org.junit.Test;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;

import com.tutorialspoint.demo.model.Product;

public class ProductServiceControllerTest extends AbstractTest {
   @Override
   @Before
   public void setUp() {
      super.setUp();
   }
   @Test
   public void getProductsList() throws Exception {
      String uri = "/products";
      MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.get(uri)
         .accept(MediaType.APPLICATION_JSON_VALUE)).andReturn();
      
      int status = mvcResult.getResponse().getStatus();
      assertEquals(200, status);
      String content = mvcResult.getResponse().getContentAsString();
      Product[] productlist = super.mapFromJson(content, Product[].class);
      assertTrue(productlist.length > 0);
   }
   @Test
   public void createProduct() throws Exception {
      String uri = "/products";
      Product product = new Product();
      product.setId("3");
      product.setName("Ginger");
      String inputJson = super.mapToJson(product);
      MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post(uri)
         .contentType(MediaType.APPLICATION_JSON_VALUE)
         .content(inputJson)).andReturn();
      
      int status = mvcResult.getResponse().getStatus();
      assertEquals(201, status);
      String content = mvcResult.getResponse().getContentAsString();
      assertEquals(content, "Product is created successfully");
   }
   @Test
   public void updateProduct() throws Exception {
      String uri = "/products/2";
      Product product = new Product();
      product.setName("Lemon");
      String inputJson = super.mapToJson(product);
      MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.put(uri)
         .contentType(MediaType.APPLICATION_JSON_VALUE)
         .content(inputJson)).andReturn();
      
      int status = mvcResult.getResponse().getStatus();
      assertEquals(200, status);
      String content = mvcResult.getResponse().getContentAsString();
      assertEquals(content, "Product is updated successsfully");
   }
   @Test
   public void deleteProduct() throws Exception {
      String uri = "/products/2";
      MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.delete(uri)).andReturn();
      int status = mvcResult.getResponse().getStatus();
      assertEquals(200, status);
      String content = mvcResult.getResponse().getContentAsString();
      assertEquals(content, "Product is deleted successsfully");
   }
}

Вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью команд Maven или Gradle, приведенных ниже -

Для Maven вы можете использовать команду, приведенную ниже -

mvn clean install

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

Для Gradle вы можете использовать команду, как показано ниже -

gradle clean build

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

Spring Boot предоставляет очень хорошую поддержку для создания источника данных для базы данных. Нам не нужно писать дополнительный код для создания источника данных в Spring Boot. Простого добавления зависимостей и выполнения деталей конфигурации достаточно, чтобы создать DataSource и подключить базу данных.

В этой главе мы собираемся использовать подключение драйвера JDBC Spring Boot для подключения к базе данных.

Во-первых, нам нужно добавить зависимость JDBC Spring Boot Starter в наш файл конфигурации сборки.

Пользователи Maven могут добавить следующие зависимости в файл pom.xml.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

Пользователи Gradle могут добавить следующие зависимости в файл build.gradle.

compile('org.springframework.boot:spring-boot-starter-jdbc')

Подключиться к базе данных H2

Чтобы подключить базу данных H2, нам нужно добавить зависимость базы данных H2 в наш файл конфигурации сборки.

Для пользователей Maven добавьте приведенную ниже зависимость в свой файл pom.xml.

<dependency>
   <groupId>com.h2database</groupId>
   <artifactId>h2</artifactId>
</dependency>

Для пользователей Gradle добавьте приведенную ниже зависимость в свой файл build.gradle.

compile('com.h2database:h2')

Для подключения к базе данных H2 нам нужно создать файлы schema.sql и data.sql в каталоге classpath src / main / resources.

Ниже представлен файл schema.sql.

CREATE TABLE PRODUCT (ID INT PRIMARY KEY, PRODUCT_NAME VARCHAR(25));

Ниже представлен файл data.sql.

INSERT INTO PRODUCT (ID,PRODUCT_NAME) VALUES (1,'Honey');
INSERT INTO PRODUCT (ID,PRODUCT_NAME) VALUES (2,'Almond');

Подключить MySQL

Чтобы подключить базу данных MySQL, нам нужно добавить зависимость MySQL в наш файл конфигурации сборки.

Для пользователей Maven добавьте следующую зависимость в свой файл pom.xml.

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
</dependency>

Для пользователей Gradle добавьте следующую зависимость в свой файл build.gradle.

compile('mysql:mysql-connector-java')

Теперь создайте базу данных и таблицы в MySQL, как показано -

Для пользователей файла свойств добавьте следующие свойства в файл application.properties.

spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/PRODUCTSERVICE?autoreconnect = true
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.testOnBorrow = true
spring.datasource.testWhileIdle = true
spring.datasource.timeBetweenEvictionRunsMillis = 60000
spring.datasource.minEvictableIdleTimeMillis = 30000
spring.datasource.validationQuery = SELECT 1
spring.datasource.max-active = 15
spring.datasource.max-idle = 10
spring.datasource.max-wait = 8000

Для пользователей YAML добавьте следующие свойства в файл application.yml.

spring:
   datasource: 
      driverClassName: com.mysql.jdbc.Driver
      url: "jdbc:mysql://localhost:3306/PRODUCTSERVICE?autoreconnect=true"
      username: "root"
      password: "root"
      testOnBorrow: true
      testWhileIdle: true
      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 30000
      validationQuery: SELECT 1
      max-active: 15
      max-idle: 10
      max-wait: 8000

Подключить Redis

Redis - это база данных с открытым исходным кодом, используемая для хранения структуры данных в памяти. Чтобы подключить базу данных Redis в приложении Spring Boot, нам нужно добавить зависимость Redis в наш файл конфигурации сборки.

Пользователи Maven должны добавить следующую зависимость в ваш файл pom.xml.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-redis</artifactId>
</dependency>

Пользователи Gradle должны добавить следующую зависимость в ваш файл build.gradle.

compile('org.springframework.boot:spring-boot-starter-data-redis')

Для подключения Redis нам нужно использовать RedisTemplate. Для RedisTemplate нам необходимо предоставить сведения о JedisConnectionFactory.

@Bean
JedisConnectionFactory jedisConnectionFactory() {
   JedisConnectionFactory jedisConFactory = new JedisConnectionFactory();
   jedisConFactory.setHostName("localhost");
   jedisConFactory.setPort(6000);
   jedisConFactory.setUsePool(true);
   return jedisConFactory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
   RedisTemplate<String, Object> template = new RedisTemplate<>();
   template.setConnectionFactory(jedisConnectionFactory());
   template.setKeySerializer(new StringRedisSerializer());
   template.setHashKeySerializer(new StringRedisSerializer());
   template.setHashValueSerializer(new StringRedisSerializer());
   template.setValueSerializer(new StringRedisSerializer());
   return template;
}

Теперь автоматически подключите класс RedisTemplate и получите доступ к данным из базы данных Redis.

@Autowired

RedisTemplate<String, Object> redis;
Map<Object,Object> datalist = redis.opsForHash().entries(“Redis_code_index_key”);

JDBCTemplate

Чтобы получить доступ к реляционной базе данных с помощью JdbcTemplate в приложении Spring Boot, нам нужно добавить зависимость JDBC Spring Boot Starter в наш файл конфигурации сборки.

Затем, если вы @Autowired класс JdbcTemplate, Spring Boot автоматически подключает базу данных и устанавливает источник данных для объекта JdbcTemplate.

@Autowired
JdbcTemplate jdbcTemplate;
Collection<Map<String, Object>> rows = jdbc.queryForList("SELECT QUERY");

В файл класса необходимо добавить аннотацию @Repository. Аннотация @Repository используется для создания репозитория базы данных для вашего приложения Spring Boot.

@Repository
public class ProductServiceDAO {
}

Множественный источник данных

Мы можем хранить n источников данных в одном приложении Spring Boot. В приведенном здесь примере показано, как создать более 1 источника данных в приложении Spring Boot. Теперь добавьте сведения о конфигурации двух источников данных в файл свойств приложения.

Для пользователей файла свойств добавьте следующие свойства в файл application.properties.

spring.dbProductService.driverClassName = com.mysql.jdbc.Driver
spring.dbProductService.url = jdbc:mysql://localhost:3306/PRODUCTSERVICE?autoreconnect = true
spring.dbProductService.username = root
spring.dbProductService.password = root
spring.dbProductService.testOnBorrow = true
spring.dbProductService.testWhileIdle = true
spring.dbProductService.timeBetweenEvictionRunsMillis = 60000
spring.dbProductService.minEvictableIdleTimeMillis = 30000
spring.dbProductService.validationQuery = SELECT 1
spring.dbProductService.max-active = 15
spring.dbProductService.max-idle = 10
spring.dbProductService.max-wait = 8000

spring.dbUserService.driverClassName = com.mysql.jdbc.Driver
spring.dbUserService.url = jdbc:mysql://localhost:3306/USERSERVICE?autoreconnect = true
spring.dbUserService.username = root
spring.dbUserService.password = root
spring.dbUserService.testOnBorrow = true
spring.dbUserService.testWhileIdle = true
spring.dbUserService.timeBetweenEvictionRunsMillis = 60000
spring.dbUserService.minEvictableIdleTimeMillis = 30000
spring.dbUserService.validationQuery = SELECT 1
spring.dbUserService.max-active = 15
spring.dbUserService.max-idle = 10
spring.dbUserService.max-wait = 8000

Пользователи Yaml должны добавить следующие свойства в ваш файл application.yml.

spring:
   dbProductService: 
      driverClassName: com.mysql.jdbc.Driver
      url: "jdbc:mysql://localhost:3306/PRODUCTSERVICE?autoreconnect=true"
      password: "root"
      username: "root"
      testOnBorrow: true
      testWhileIdle: true
      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 30000
      validationQuery: SELECT 1
      max-active: 15
      max-idle: 10
      max-wait: 8000
   dbUserService: 
      driverClassName: com.mysql.jdbc.Driver
      url: "jdbc:mysql://localhost:3306/USERSERVICE?autoreconnect=true"
      password: "root"
      username: "root"
      testOnBorrow: true
      testWhileIdle: true
      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 30000
      validationQuery: SELECT 1    
      max-active: 15
      max-idle: 10
      max-wait: 8000

Теперь создайте класс Configuration для создания DataSource и JdbcTemplate для нескольких источников данных.

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;

@Configuration
public class DatabaseConfig {
   @Bean(name = "dbProductService")
   @ConfigurationProperties(prefix = "spring.dbProductService")
   @Primary
   public DataSource createProductServiceDataSource() {
      return DataSourceBuilder.create().build();
   }
   @Bean(name = "dbUserService")
   @ConfigurationProperties(prefix = "spring.dbUserService")
   public DataSource createUserServiceDataSource() {
      return DataSourceBuilder.create().build();
   }
   @Bean(name = "jdbcProductService")
   @Autowired
   public JdbcTemplate createJdbcTemplate_ProductService(@Qualifier("dbProductService") DataSource productServiceDS) {
      return new JdbcTemplate(productServiceDS);
   }
   @Bean(name = "jdbcUserService")
   @Autowired
   public JdbcTemplate createJdbcTemplate_UserService(@Qualifier("dbUserService") DataSource userServiceDS) {
      return new JdbcTemplate(userServiceDS);
   }
}

Затем автоматически подключите объект JDBCTemplate с помощью аннотации @Qualifier.

@Qualifier("jdbcProductService")
@Autowired
JdbcTemplate jdbcTemplate;

@Qualifier("jdbcUserService")
@Autowired
JdbcTemplate jdbcTemplate;

Если в путь к классам добавляется зависимость Spring Boot Security, приложение Spring Boot автоматически требует базовой аутентификации для всех конечных точек HTTP. Конечная точка «/» и «/ home» не требует аутентификации. Все остальные конечные точки требуют аутентификации.

Чтобы добавить Spring Boot Security в ваше приложение Spring Boot, нам нужно добавить зависимость Spring Boot Starter Security в наш файл конфигурации сборки.

Пользователи Maven могут добавить следующую зависимость в файл pom.xml.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Пользователи Gradle могут добавить следующую зависимость в файл build.gradle.

compile("org.springframework.boot:spring-boot-starter-security")

Защита веб-приложения

Сначала создайте незащищенное веб-приложение с помощью шаблонов Thymeleaf.

Затем создайте файл home.html в src/main/resources/templates каталог.

<!DOCTYPE html>
<html xmlns = "http://www.w3.org/1999/xhtml" 
   xmlns:th = "http://www.thymeleaf.org" 
   xmlns:sec = "http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
   
   <head>
      <title>Spring Security Example</title>
   </head>
   <body>
      <h1>Welcome!</h1>
      <p>Click <a th:href = "@{/hello}">here</a> to see a greeting.</p>
   </body>
   
</html>

Простой вид /hello определены в файле HTML с помощью шаблонов Thymeleaf.

Теперь создайте hello.html в src/main/resources/templates каталог.

<!DOCTYPE html>
<html xmlns = "http://www.w3.org/1999/xhtml" 
   xmlns:th = "http://www.thymeleaf.org" 
   xmlns:sec = "http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
   
   <head>
      <title>Hello World!</title>
   </head>
   <body>
      <h1>Hello world!</h1>
   </body>
   
</html>

Теперь нам нужно настроить контроллер Spring MVC - View для домашнего и приветственного просмотра.

Для этого создайте файл конфигурации MVC, который расширяет WebMvcConfigurerAdapter.

package com.tutorialspoint.websecuritydemo;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
   @Override
   public void addViewControllers(ViewControllerRegistry registry) {
      registry.addViewController("/home").setViewName("home");
      registry.addViewController("/").setViewName("home");
      registry.addViewController("/hello").setViewName("hello");
      registry.addViewController("/login").setViewName("login");
   }
}

Теперь добавьте зависимость безопасности Spring Boot Starter в файл конфигурации сборки.

Пользователи Maven могут добавить следующую зависимость в ваш файл pom.xml.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Пользователи Gradle могут добавить следующую зависимость в файл build.gradle.

compile("org.springframework.boot:spring-boot-starter-security")

Теперь создайте файл конфигурации веб-безопасности, который используется для защиты вашего приложения от доступа к конечным точкам HTTP с помощью базовой проверки подлинности.

package com.tutorialspoint.websecuritydemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
   @Override
   protected void configure(HttpSecurity http) throws Exception {
      http
         .authorizeRequests()
            .antMatchers("/", "/home").permitAll()
            .anyRequest().authenticated()
            .and()
         .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
            .logout()
            .permitAll();
   }
   @Autowired
   public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
      auth
         .inMemoryAuthentication()
         .withUser("user").password("password").roles("USER");
   }
}

Теперь создайте файл login.html под src/main/resources каталог, чтобы позволить пользователю получить доступ к конечной точке HTTP через экран входа в систему.

<!DOCTYPE html>
<html xmlns = "http://www.w3.org/1999/xhtml" xmlns:th = "http://www.thymeleaf.org"
   xmlns:sec = "http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
   
   <head>
      <title>Spring Security Example </title>
   </head>
   <body>
      <div th:if = "${param.error}">
         Invalid username and password.
      </div>
      <div th:if = "${param.logout}">
         You have been logged out.
      </div>
      
      <form th:action = "@{/login}" method = "post">
         <div>
            <label> User Name : <input type = "text" name = "username"/> </label>
         </div>
         <div>
            <label> Password: <input type = "password" name = "password"/> </label>
         </div>
         <div>
            <input type = "submit" value = "Sign In"/>
         </div>
      </form>
      
   </body>
</html>

Наконец, обновите файл hello.html, чтобы позволить пользователю выйти из приложения и отобразить текущее имя пользователя, как показано ниже -

<!DOCTYPE html>
<html xmlns = "http://www.w3.org/1999/xhtml" xmlns:th = "http://www.thymeleaf.org" 
   xmlns:sec = "http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
   
   <head>
      <title>Hello World!</title>
   </head>
   <body>
      <h1 th:inline = "text">Hello [[${#httpServletRequest.remoteUser}]]!</h1>
      <form th:action = "@{/logout}" method = "post">
         <input type = "submit" value = "Sign Out"/>
      </form>
   </body>
   
</html>

Код для основного приложения Spring Boot приведен ниже -

package com.tutorialspoint.websecuritydemo;

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

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

Полный код файла конфигурации сборки приведен ниже.

Maven – pom.xml

<?xml version  =  "1.0" encoding  =  "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>websecurity-demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>websecurity-demo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.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-security</artifactId>
      </dependency>
      
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-thymeleaf</artifactId>
      </dependency>
      
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
      
      <dependency>
         <groupId>org.springframework.security</groupId>
         <artifactId>spring-security-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Gradle – build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter-security')
   compile('org.springframework.boot:spring-boot-starter-thymeleaf')
   compile('org.springframework.boot:spring-boot-starter-web')
   
   testCompile('org.springframework.boot:spring-boot-starter-test')
   testCompile('org.springframework.security:spring-security-test')
}

Теперь создайте исполняемый файл JAR и запустите приложение Spring Boot, используя следующие команды Maven или Gradle.

Пользователи Maven могут использовать команду, указанную ниже -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Пользователи Gradle могут использовать команду, как показано ниже -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Теперь запустите файл JAR, используя команду, показанную ниже -

java –jar <JARFILE>

Нажмите на URL http://localhost:8080/в вашем веб-браузере. Вы можете увидеть результат, как показано.

В этой главе вы подробно узнаете о механизмах Spring Boot Security и OAuth2 с JWT.

Сервер авторизации

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

Сервер ресурсов

Сервер ресурсов - это приложение, которое предоставляет токен доступа клиентам для доступа к конечным точкам HTTP сервера ресурсов. Это набор библиотек, который содержит конечные точки HTTP, статические ресурсы и динамические веб-страницы.

OAuth2

OAuth2 - это структура авторизации, которая позволяет приложению Web Security получать доступ к ресурсам от клиента. Чтобы создать приложение OAuth2, нам нужно сосредоточиться на типе предоставления (код авторизации), идентификаторе клиента и секрете клиента.

Токен JWT

Токен JWT - это веб-токен JSON, используемый для представления утверждений, защищенных между двумя сторонами. Вы можете узнать больше о токене JWT на www.jwt.io/ .

Теперь мы собираемся создать приложение OAuth2, которое позволяет использовать сервер авторизации, сервер ресурсов с помощью токена JWT.

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

Во-первых, нам нужно добавить следующие зависимости в наш файл конфигурации сборки.

Пользователи Maven могут добавить следующие зависимости в ваш файл pom.xml.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
   <groupId>org.springframework.security.oauth</groupId>
   <artifactId>spring-security-oauth2</artifactId>
</dependency>

<dependency>
   <groupId>org.springframework.security</groupId>
   <artifactId>spring-security-jwt</artifactId>
</dependency>

<dependency>
   <groupId>com.h2database</groupId>
   <artifactId>h2</artifactId>
</dependency>

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
</dependency>

<dependency>
   <groupId>org.springframework.security</groupId>
   <artifactId>spring-security-test</artifactId>
   <scope>test</scope>
</dependency>

Пользователи Gradle могут добавить следующие зависимости в файл build.gradle.

compile('org.springframework.boot:spring-boot-starter-security')
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile('org.springframework.security:spring-security-test')

compile("org.springframework.security.oauth:spring-security-oauth2")
compile('org.springframework.security:spring-security-jwt')
compile("org.springframework.boot:spring-boot-starter-jdbc")
compile("com.h2database:h2:1.4.191")

где,

  • Spring Boot Starter Security - Реализует Spring Security

  • Spring Security OAuth2 - Реализует структуру OAUTH2 для включения сервера авторизации и сервера ресурсов.

  • Spring Security JWT - Генерирует токен JWT для веб-безопасности

  • Spring Boot Starter JDBC - Доступ к базе данных, чтобы убедиться, что пользователь доступен или нет.

  • Spring Boot Starter Web - Записывает конечные точки HTTP.

  • H2 Database - Хранит информацию о пользователе для аутентификации и авторизации.

Полный файл конфигурации сборки представлен ниже.

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>websecurityapp</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>websecurityapp</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.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-jdbc</artifactId>
      </dependency>
      
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-security</artifactId>
      </dependency>
      
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      
      <dependency>
         <groupId>org.springframework.security.oauth</groupId>
         <artifactId>spring-security-oauth2</artifactId>
      </dependency>
      
      <dependency>
         <groupId>org.springframework.security</groupId>
         <artifactId>spring-security-jwt</artifactId>
      </dependency>
      
      <dependency>
         <groupId>com.h2database</groupId>
         <artifactId>h2</artifactId>
      </dependency>
      
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
      
      <dependency>
         <groupId>org.springframework.security</groupId>
         <artifactId>spring-security-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Gradle – build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}

dependencies {
   compile('org.springframework.boot:spring-boot-starter-security')
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
   testCompile('org.springframework.security:spring-security-test')
   compile("org.springframework.security.oauth:spring-security-oauth2")
   compile('org.springframework.security:spring-security-jwt')
   compile("org.springframework.boot:spring-boot-starter-jdbc")
   compile("com.h2database:h2:1.4.191")  
}

Теперь в основном приложении Spring Boot добавьте аннотации @EnableAuthorizationServer и @EnableResourceServer, чтобы они действовали как сервер аутентификации и сервер ресурсов в одном приложении.

Кроме того, вы можете использовать следующий код для написания простой конечной точки HTTP для доступа к API с помощью Spring Security с помощью токена JWT.

package com.tutorialspoint.websecurityapp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableAuthorizationServer
@EnableResourceServer
@RestController
public class WebsecurityappApplication {
   public static void main(String[] args) {
      SpringApplication.run(WebsecurityappApplication.class, args);
   }
   @RequestMapping(value = "/products")
   public String getProductName() {
      return "Honey";   
   }
}

Используйте следующий код, чтобы определить класс POJO для хранения информации о пользователе для аутентификации.

package com.tutorialspoint.websecurityapp;

import java.util.ArrayList;
import java.util.Collection;
import org.springframework.security.core.GrantedAuthority;

public class UserEntity {
   private String username;
   private String password;
   private Collection<GrantedAuthority> grantedAuthoritiesList = new ArrayList<>();
   
   public String getPassword() {
      return password;
   }
   public void setPassword(String password) {
      this.password = password;
   }
   public Collection<GrantedAuthority> getGrantedAuthoritiesList() {
      return grantedAuthoritiesList;
   }
   public void setGrantedAuthoritiesList(Collection<GrantedAuthority> grantedAuthoritiesList) {
      this.grantedAuthoritiesList = grantedAuthoritiesList;
   }
   public String getUsername() {
      return username;
   }
   public void setUsername(String username) {
      this.username = username;
   }
}

Теперь используйте следующий код и определите класс CustomUser, который расширяет класс org.springframework.security.core.userdetails.User для аутентификации Spring Boot.

package com.tutorialspoint.websecurityapp;

import org.springframework.security.core.userdetails.User;

public class CustomUser extends User {
   private static final long serialVersionUID = 1L;
   public CustomUser(UserEntity user) {
      super(user.getUsername(), user.getPassword(), user.getGrantedAuthoritiesList());
   }
}

Вы можете создать класс @Repository для чтения информации о пользователе из базы данных и отправки ее в пользовательскую службу, а также добавить предоставленные права доступа «ROLE_SYSTEMADMIN».

package com.tutorialspoint.websecurityapp;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.stereotype.Repository;

@Repository
public class OAuthDao {
   @Autowired
   private JdbcTemplate jdbcTemplate;

   public UserEntity getUserDetails(String username) {
      Collection<GrantedAuthority> grantedAuthoritiesList = new ArrayList<>();
      String userSQLQuery = "SELECT * FROM USERS WHERE USERNAME=?";
      List<UserEntity> list = jdbcTemplate.query(userSQLQuery, new String[] { username },
         (ResultSet rs, int rowNum) -> {
         
         UserEntity user = new UserEntity();
         user.setUsername(username);
         user.setPassword(rs.getString("PASSWORD"));
         return user;
      });
      if (list.size() > 0) {
         GrantedAuthority grantedAuthority = new SimpleGrantedAuthority("ROLE_SYSTEMADMIN");
         grantedAuthoritiesList.add(grantedAuthority);
         list.get(0).setGrantedAuthoritiesList(grantedAuthoritiesList);
         return list.get(0);
      }
      return null;
   }
}

Вы можете создать пользовательский класс обслуживания сведений о пользователе, который расширяет org.springframework.security.core.userdetails.UserDetailsService для вызова класса репозитория DAO, как показано.

package com.tutorialspoint.websecurityapp;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

@Service
public class CustomDetailsService implements UserDetailsService {
   @Autowired
   OAuthDao oauthDao;

   @Override
   public CustomUser loadUserByUsername(final String username) throws UsernameNotFoundException {
      UserEntity userEntity = null;
      try {
         userEntity = oauthDao.getUserDetails(username);
         CustomUser customUser = new CustomUser(userEntity);
         return customUser;
      } catch (Exception e) {
         e.printStackTrace();
         throw new UsernameNotFoundException("User " + username + " was not found in the database");
      }
   }
}

Затем создайте класс @configuration, чтобы включить веб-безопасность, определив кодировщик паролей (BCryptPasswordEncoder) и определив bean-компонент AuthenticationManager. Класс конфигурации безопасности должен расширять класс WebSecurityConfigurerAdapter.

package com.tutorialspoint.websecurityapp;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
   @Autowired
   private CustomDetailsService customDetailsService;

   @Bean
   public PasswordEncoder encoder() {
      return new BCryptPasswordEncoder();
   }
   @Override
   @Autowired
   protected void configure(AuthenticationManagerBuilder auth) throws Exception {
      auth.userDetailsService(customDetailsService).passwordEncoder(encoder());
   }
   @Override
   protected void configure(HttpSecurity http) throws Exception {
      http.authorizeRequests().anyRequest().authenticated().and().sessionManagement()
         .sessionCreationPolicy(SessionCreationPolicy.NEVER);
   }
   @Override
   public void configure(WebSecurity web) throws Exception {
      web.ignoring();
   }
   @Override
   @Bean
   public AuthenticationManager authenticationManagerBean() throws Exception {
      return super.authenticationManagerBean();
   }
}

Теперь определите класс конфигурации OAuth2, чтобы добавить идентификатор клиента, секрет клиента, определить JwtAccessTokenConverter, закрытый ключ и открытый ключ для ключа подписывающего токена и ключа верификатора, а также настроить ClientDetailsServiceConfigurer для допустимости токена с областями.

package com.tutorialspoint.websecurityapp;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;

@Configuration
public class OAuth2Config extends AuthorizationServerConfigurerAdapter {
   private String clientid = "tutorialspoint";
   private String clientSecret = "my-secret-key";
   private String privateKey = "private key";
   private String publicKey = "public key";

   @Autowired
   @Qualifier("authenticationManagerBean")
   private AuthenticationManager authenticationManager;
   
   @Bean
   public JwtAccessTokenConverter tokenEnhancer() {
      JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
      converter.setSigningKey(privateKey);
      converter.setVerifierKey(publicKey);
      return converter;
   }
   @Bean
   public JwtTokenStore tokenStore() {
      return new JwtTokenStore(tokenEnhancer());
   }
   @Override
   public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
      endpoints.authenticationManager(authenticationManager).tokenStore(tokenStore())
      .accessTokenConverter(tokenEnhancer());
   }
   @Override
   public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
      security.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");
   }
   @Override
   public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
      clients.inMemory().withClient(clientid).secret(clientSecret).scopes("read", "write")
         .authorizedGrantTypes("password", "refresh_token").accessTokenValiditySeconds(20000)
         .refreshTokenValiditySeconds(20000);

   }
}

Теперь создайте закрытый ключ и открытый ключ с помощью openssl.

Вы можете использовать следующие команды для генерации закрытого ключа.

openssl genrsa -out jwt.pem 2048
openssl rsa -in jwt.pem

Вы можете использовать для генерации открытого ключа следующие команды.

openssl rsa -in jwt.pem -pubout

Для версии Spring Boot более поздней, чем выпуск 1.5, добавьте указанное ниже свойство в файл application.properties, чтобы определить порядок фильтрации ресурсов OAuth2.

security.oauth2.resource.filter-order=3

Пользователи файла YAML могут добавить указанное ниже свойство в файл YAML.

security:
   oauth2:
      resource:
         filter-order: 3

Теперь создайте файл schema.sql и data.sql в ресурсах пути к классам. src/main/resources/directory для подключения приложения к базе данных H2.

Файл schema.sql выглядит следующим образом:

CREATE TABLE USERS (ID INT PRIMARY KEY, USERNAME VARCHAR(45), PASSWORD VARCHAR(60));

Файл data.sql выглядит следующим образом:

INSERT INTO USERS (ID, USERNAME,PASSWORD) VALUES (
   1, '[email protected]','$2a$08$fL7u5xcvsZl78su29x1ti.dxI.9rYO8t0q5wk2ROJ.1cdR53bmaVG'); INSERT INTO USERS (ID, USERNAME,PASSWORD) VALUES ( 2, '[email protected]','$2a$08$fL7u5xcvsZl78su29x1ti.dxI.9rYO8t0q5wk2ROJ.1cdR53bmaVG');

Note - Пароль должен храниться в формате Bcrypt Encoder в таблице базы данных.

Вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью следующих команд Maven или Gradle.

Для Maven вы можете использовать команду, приведенную ниже -

mvn clean install

После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.

Для Gradle вы можете использовать команду, как показано -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Теперь запустите файл JAR, используя показанную здесь команду -

java –jar <JARFILE>

Приложение запускается на порту 8080 Tomcat.

Теперь нажмите URL-адрес метода POST через POSTMAN, чтобы получить токен OAUTH2.

http://localhost:8080/oauth/token

Теперь добавьте заголовки запроса следующим образом -

  • Authorization - Базовая аутентификация с вашим идентификатором клиента и секретом клиента.

  • Content Type - приложение / x-www-form-urlencoded

Теперь добавьте параметры запроса следующим образом -

  • grant_type = пароль
  • username = ваше имя пользователя
  • пароль = ваш пароль

Теперь нажмите API и получите access_token, как показано -

Теперь нажмите API сервера ресурсов с токеном доступа Bearer в заголовке запроса, как показано.

Затем вы можете увидеть результат, как показано ниже -

Google Cloud Platform предоставляет услуги облачных вычислений, которые запускают приложение Spring Boot в облачной среде. В этой главе мы увидим, как развернуть приложение Spring Boot на платформе движка приложений GCP.

Сначала загрузите приложение Spring Boot сборки Gradle со страницы Spring Initializer www.start.spring.io . Обратите внимание на следующий снимок экрана.

Теперь в файле build.gradle добавьте плагин Google Cloud appengine и зависимость пути к классам appengine.

Код для файла build.gradle приведен ниже -

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
      classpath 'com.google.cloud.tools:appengine-gradle-plugin:1.3.3'
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'com.google.cloud.tools.appengine'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

Теперь напишите простую конечную точку HTTP, и она вернет успех String, как показано -

package com.tutorialspoint.appenginedemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class AppengineDemoApplication {
   public static void main(String[] args) {
      SpringApplication.run(AppengineDemoApplication.class, args);
   }
   @RequestMapping(value = "/")
   public String success() {
      return "APP Engine deployment success";
   }
}

Затем добавьте файл app.yml в каталог src / main / appengine, как показано -

runtime: java
env: flex

handlers:
- url: /.*
   script: this field is required, but ignored

Теперь перейдите в консоль Google Cloud и нажмите Активировать облачную оболочку Google вверху страницы.

Теперь переместите исходные файлы и файл Gradle в домашний каталог облачной машины Google с помощью облачной оболочки Google.

Теперь выполните команду gradle appengineDeploy, и она развернет ваше приложение в движке приложений Google Cloud.

Note - В GCP должен быть включен биллинг, и перед развертыванием приложения в appengine вы должны создать платформу appengine в GCP.

Развертывание приложения на платформе GCP appengine займет несколько минут.

После успешной сборки вы можете увидеть URL-адрес службы в окне консоли.

Теперь нажмите URL-адрес службы и посмотрите результат.

Google Cloud SQL

Чтобы подключить Google Cloud SQL к приложению Spring Boot, вы должны добавить следующие свойства в файл application.properties.

Формат URL JDBC

jdbc:mysql://google/<DATABASE-NAME>?cloudSqlInstance = <GOOGLE_CLOUD_SQL_INSTANCE_NAME> &socketFactory = com.google.cloud.sql.mysql.SocketFactory&user = <USERNAME>&password = <PASSWORD>

Note - Приложение Spring Boot и Google Cloud SQL должны находиться в одном проекте GCP.

Ниже приведен файл application.properties.

spring.dbProductService.driverClassName = com.mysql.jdbc.Driver
spring.dbProductService.url = jdbc:mysql://google/PRODUCTSERVICE?cloudSqlInstance = springboot-gcp-cloudsql:asia-northeast1:springboot-gcp-cloudsql-instance&socketFactory = com.google.cloud.sql.mysql.SocketFactory&user = root&password = rootspring.dbProductService.username = root

spring.dbProductService.password = root
spring.dbProductService.testOnBorrow = true
spring.dbProductService.testWhileIdle = true
spring.dbProductService.timeBetweenEvictionRunsMillis = 60000
spring.dbProductService.minEvictableIdleTimeMillis = 30000
spring.dbProductService.validationQuery = SELECT 1
spring.dbProductService.max-active = 15
spring.dbProductService.max-idle = 10
spring.dbProductService.max-wait = 8000

Пользователи файла YAML могут добавить указанные ниже свойства в файл application.yml.

spring:
   datasource: 
      driverClassName: com.mysql.jdbc.Driver
      url: "jdbc:mysql://google/PRODUCTSERVICE?cloudSqlInstance=springboot-gcp-cloudsql:asia-northeast1:springboot-gcp-cloudsql-instance&socketFactory=com.google.cloud.sql.mysql.SocketFactory&user=root&password=root"
      password: "root"
      username: "root"
      testOnBorrow: true
      testWhileIdle: true
      validationQuery: SELECT 1
      
      max-active: 15
      max-idle: 10
      max-wait: 8000

В этой главе мы увидим, как добавить вход Google OAuth2 с помощью приложения Spring Boot со сборкой Gradle.

Сначала добавьте зависимость безопасности Spring Boot OAuth2 в файл конфигурации сборки, и файл конфигурации сборки приведен ниже.

buildscript {
   ext {
      springBootVersion = '1.5.8.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint.projects'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter')
   testCompile('org.springframework.boot:spring-boot-starter-test')
   compile('org.springframework.security.oauth:spring-security-oauth2')
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

Теперь добавьте конечную точку HTTP для чтения участника-пользователя из Google после аутентификации через Spring Boot в основном файле класса приложения Spring Boot, как показано ниже -

package com.tutorialspoint.projects.googleservice;

import java.security.Principal;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class GoogleserviceApplication {
   public static void main(String[] args) {
      SpringApplication.run(GoogleserviceApplication.class, args);
   }
   @RequestMapping(value = "/user")
   public Principal user(Principal principal) {
      return principal;
   }
}

Теперь напишите файл конфигурации, чтобы включить OAuth2SSO для веб-безопасности, и удалите аутентификацию для файла index.html, как показано:

package com.tutorialspoint.projects.googleservice;

import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableOAuth2Sso
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
   @Override
   protected void configure(HttpSecurity http) throws Exception {
      http
         .csrf()
         .disable()
         .antMatcher("/**")
         .authorizeRequests()
         .antMatchers("/", "/index.html")
         .permitAll()
         .anyRequest()
         .authenticated();
   }
}

Затем добавьте файл index.html в статические ресурсы и добавьте ссылку для перенаправления в конечную точку HTTP пользователя, чтобы прочитать Принципала пользователя Google, как показано ниже -

<!DOCTYPE html>
<html>
   <head>
      <meta charset = "ISO-8859-1">
      <title>Insert title here</title>
   </head>
   <body>
      <a href = "user">Click here to Google Login</a>
   </body>
</html>

Note - В консоли Google Cloud - включите службы Gmail, службы аналитики и API служб Google+.

Затем перейдите в раздел «Учетные данные», создайте учетные данные и выберите «Идентификатор клиента OAuth».

Затем укажите название продукта на экране согласия OAuth2.

Затем выберите Тип приложения как «Веб-приложение», укажите авторизованные источники JavaScript и авторизованные URI перенаправления.

Теперь ваш идентификатор клиента OAuth2 и секрет клиента созданы.

Затем добавьте идентификатор клиента и секрет клиента в файл свойств приложения.

security.oauth2.client.clientId = <CLIENT_ID>
security.oauth2.client.clientSecret = <CLIENT_SECRET>
security.oauth2.client.accessTokenUri  =  https://www.googleapis.com/oauth2/v3/token
security.oauth2.client.userAuthorizationUri  =  https://accounts.google.com/o/oauth2/auth
security.oauth2.client.tokenName = oauth_token
security.oauth2.client.authenticationScheme = query
security.oauth2.client.clientAuthenticationScheme = form
security.oauth2.client.scope = profile email

security.oauth2.resource.userInfoUri  =  https://www.googleapis.com/userinfo/v2/me
security.oauth2.resource.preferTokenInfo = false

Теперь вы можете создать исполняемый файл JAR и запустить приложение Spring Boot с помощью следующей команды Gradle.

Для Gradle вы можете использовать команду, как показано -

gradle clean build

После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.

Запустите файл JAR с помощью команды java –jar <JARFILE>, и приложение будет запущено на порту 8080 Tomcat.

Теперь нажмите URL-адрес http://localhost:8080/ и щелкните ссылку входа в Google.

Он будет перенаправлен на экран входа в Google и предоставит данные для входа в Gmail.

В случае успешного входа мы получим объект Principal пользователя Gmail.