Учебники

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

Spring Boot — Введение

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

Что такое Микро Сервис?

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

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

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

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

Что такое Spring Boot?

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

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

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

  • Легко понять и разработать весенние приложения
  • Увеличивает производительность
  • Сокращает время разработки

цели

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

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

Почему Spring Boot?

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

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

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

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

  • Это предлагает основанное на аннотации весеннее заявление

  • Облегчает управление зависимостями

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

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

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

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

Это предлагает основанное на аннотации весеннее заявление

Облегчает управление зависимостями

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

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

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

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

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

Стартеры весенней загрузки

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

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

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

Примеры

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

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

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

Зависимость Spring Boot Starter Security используется для Spring Security. Его код показан ниже —

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

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

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

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

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

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

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

Авто Конфигурация

Автоматическая настройка Spring Boot автоматически настраивает приложение 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 Boot.

Если вы добавили аннотацию @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 — Быстрый старт

В этой главе вы узнаете, как создать приложение 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-Start-Installation-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

  • весна-загрузка-кли-2.0.0.BUILD-ПАНОРАМА-bin.tar.gz

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

весна-загрузка-кли-2.0.0.BUILD-ПАНОРАМА-bin.tar.gz

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

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

Версия Spring CLI

Запустите Hello World с Groovy

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

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

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

Запустите Hello World с Groovy

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

Запустите Groovy File Tomcat Port

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

Hello Spring Boot

Spring Boot — Самозагрузка

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

Spring Initializer

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

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

Spring Initializer

После того как вы указали группу, артефакт, зависимости, проект сборки, платформу и версию, нажмите кнопку « Создать проект» . Zip-файл загрузится, и файлы будут извлечены.

Этот раздел объясняет вам примеры, используя Maven и Gradle.

специалист

После загрузки проекта разархивируйте файл. Теперь ваш файл 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 предоставляет несколько стартеров для добавления банок в наш путь к классам. Например, для написания конечной точки отдыха нам нужно добавить зависимость 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 в самом файле основного класса Spring Boot Application, выполните следующие действия:

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

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

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

Во-первых, добавьте аннотацию @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, как показано ниже:

Команда MVN Clean Install

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

Построить успех сообщение

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

Gradle Clean Build

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

СОЗДАТЬ УСПЕШНОЕ сообщение в командной строке

Запустите Hello World с Java

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

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

Целевой каталог файлов JAR Maven

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

JAR-файл в каталоге Build Libs

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

JAR-файл с именем Demo SNAPSHOT

После того, как вы запустите JAR-файл, вы увидите вывод в окне консоли, как показано ниже —

Вывод в окне консоли

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

Tomcat запущен на порту 8080 (http).

Spring Boot — развертывание Tomcat

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

Spring Boot Servlet Initializer

Традиционный способ развертывания — заставить класс 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.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 добавьте плагин приложения и плагин war в 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.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-файл, и вы сможете найти его в целевом каталоге, как показано на скриншотах ниже:

Maven MVN Пакет

Целевой каталог приложений упаковки Maven

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

Команда Gradle Clean Build

Целевой каталог приложений упаковки Maven

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

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

Tomcat Web Application Maneger

Каталог веб-приложений

После успешного развертывания, нажмите на 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.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 — системы сборки

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

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

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

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

Maven Dependency

Для конфигурации Maven мы должны наследовать родительский проект Spring Boot Starter для управления зависимостями Spring Boot Starter. Для этого мы можем просто унаследовать родительский родительский файл в нашем файле 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 Родительская зависимость, как 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 — структура кода

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

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

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

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

Типичный макет

Типичный макет приложения Spring Boot показан на рисунке ниже —

Типичный макет приложения Spring Boot

Файл Application.java должен объявлять метод main вместе с @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 используется для поиска бинов и соответствующих объектов, введенных с помощью аннотации @Autowired .

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

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

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

В следующем коде показан код для автоматически проводного объекта Rest Rest и объекта создания компонента в основном файле класса 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. Вы можете использовать эти интерфейсы для выполнения любых действий сразу после запуска приложения. Эта глава рассказывает о них подробно.

Приложение Runner

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 от Application Runner , оператор println выполняется после запуска Tomcat. Актуален ли следующий скриншот?

Привет мир от приложения Runner

Runner командной строки

Командная строка 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");
   }
}

Посмотрите в окне консоли ниже «Привет, мир из командной строки». Оператор println выполняется после запуска Tomcat.

Runner командной строки

Spring Boot — Свойства приложения

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

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

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

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

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

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

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

Файл свойств

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

Файл 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

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

Вместо того, чтобы хранить файл свойств в classpath, мы можем хранить свойства в другом месте или пути. При запуске файла 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;
   }
}   

Примечание. Если свойство не найдено во время работы приложения, Spring Boot создает исключение недопустимого аргумента как « Не удалось разрешить заполнитель« spring.application.name »в значении« $ {spring.application.name} » .

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

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

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

Spring Boot Active Profile

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

Весенний активный профиль в приложении. Свойства

Давайте разберемся, как сделать Spring активным профилем в 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 на основе каждого файла свойств. По умолчанию приложение Spring Boot использует файл application.properties. Команда для установки активного профиля пружины показана ниже —

Prod.Properties Active Dev

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

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)

Весенний активный профиль для 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

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

Prod.Properties Active Dev

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

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 — Logging

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

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

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

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

Spring Boot Log Format

которая дает вам следующую информацию —

  • Дата и время, которые дают дату и время журнала

  • Уровень журнала показывает INFO, ERROR или WARN

  • Идентификатор процесса

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

  • Имя потока заключено в квадратные скобки []

  • Имя регистратора, которое показывает имя класса Source

  • Лог-сообщение

Дата и время, которые дают дату и время журнала

Уровень журнала показывает INFO, ERROR или WARN

Идентификатор процесса

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

Имя потока заключено в квадратные скобки []

Имя регистратора, которое показывает имя класса Source

Лог-сообщение

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

Сообщения журнала по умолчанию будут распечатаны в окне консоли. По умолчанию сообщения журнала «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

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

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

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

logging.level.root = WARN

Примечание. Logback не поддерживает журнал уровня «FATAL». Он отображается в журнале уровня «ОШИБКА».

Настроить Logback

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

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

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

Вы можете настроить консольный appender в файле 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>

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

<?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);
   }
}

Вывод, который вы видите в окне консоли, показан здесь —

Окно консоли Logger

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

Выход журнала

Spring Boot — создание веб-сервисов RESTful

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

Примечание. Для создания веб-служб 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 — 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. Ниже приведен файл класса контроллера, который содержит метод GET REST Endpoint.

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 для хранения Product, где продукт представляет собой класс 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 Delete используется для удаления существующего ресурса. Этот метод не содержит тела запроса. Мы можем отправить параметры запроса и переменные пути, чтобы определить пользовательский или динамический 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);
   }
}

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

Класс основного приложения 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);
   }
}

Класс 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;
   }
}

Класс Rest Controller — 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> 

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

Запущенное приложение на Tomcat Port8080

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

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

Приложение POSTMAN Получить URL API

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

URL приложения API POSTMAN Post

URL PUT API: http: // localhost: 8080 / products / 3

URL приложения API POSTMAN Put

УДАЛИТЬ API URL-адрес: http: // localhost: 8080 / products / 3

URL-адрес API для удаления приложения POSTMAN

Spring Boot — обработка исключений

Обработка исключений и ошибок в 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 для продукта приведен ниже —

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 — 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>

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

Обработка исключений Запущено приложение Tomcat

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

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

URL обновления приложения почтальона

Spring Boot — Перехватчик

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

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

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

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

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

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

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

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

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

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

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

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

Метод 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);
   }
}

Код для файла класса Controller 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 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, как показано ниже:

Запущенное приложение на Tomcat Port 8080

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

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

Приложение POSTMAN Получить URL API

В окне консоли вы можете увидеть операторы System.out.println, добавленные в Перехватчик, как показано на приведенном ниже снимке экрана:

Окно консоли вывода перехватчика

Spring Boot — Servlet Filter

Фильтр — это объект, используемый для перехвата 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> 

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

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

Tomcat запущен на порте 8080 HTTP

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

Удаленный хост Удаленный адрес в журнале консоли

Spring Boot — номер порта Tomcat

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

Примечание. Если при запуске приложения Spring Boot номер server.port равен 0, 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();
   }
}

ПОЛУЧИТЬ

Использование GET API с помощью метода RestTemplate — exchange ()

Предположим, этот 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();
   }
}

СООБЩЕНИЕ

Использование POST API с помощью метода RestTemplate — exchange ()

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

Код, приведенный ниже, является телом запроса —

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

Код, приведенный ниже, является телом ответа —

Product is created successfully

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

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

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

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

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

Автоматически подключен объект шаблона 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();
   }
}

ПОЛОЖИЛ

Использование API PUT с помощью метода RestTemplate — exchange ()

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

Код, приведенный ниже, является телом запроса.

{
   "name":"Indian Ginger"
}

Код, приведенный ниже, является телом ответа —

Product is updated successfully

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

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

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

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

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

Автоматически подключен объект шаблона 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();
   }
}

УДАЛЯТЬ

Использование API DELETE с помощью метода RestTemplate — exchange ()

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

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

Product is deleted successfully

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

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

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

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

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

Автоматически подключен объект шаблона 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 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);
   }
}

Код для сборки 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> 

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

Запущенное приложение на Tomcat Port_8080

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

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

ПОЛУЧИТЬ продукты по шаблону отдыха

Создание продуктов POST — http: // localhost: 8080 / template / products

Создание продуктов POST

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

Обновление продуктов POST

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

Удалить продукты POST

Spring Boot — Обработка файлов

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

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

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

@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 для загрузки файла. Нам нужно установить HttpHeader Content-Disposition в Response и указать тип Media в ответе приложения.

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

@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> 

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

ПОСТМАН Применение

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

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

Загрузка файла приложения POSTMAN

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

Spring Boot — Сервисные компоненты

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

public interface ProductService {
}

Класс, который реализует интерфейс с аннотацией @Service, показан ниже:

@Service
public class ProductServiceImpl implements ProductService {
}

Обратите внимание, что в этом руководстве мы используем API-интерфейсы Product Product для хранения, поиска, обновления и удаления продуктов. Мы написали бизнес-логику в самом файле класса @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, и вы можете увидеть результат, как показано ниже —

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

Приложение почтальона GET API URL

URL POST API — http: // localhost: 8080 / products

URL-адрес API почтового приложения POST

URL PUT API — http: // localhost: 8080 / products / 3

URL приложения PUT API для приложения почтальон

УДАЛИТЬ API URL-адрес — http: // localhost: 8080 / products / 3

Приложение почтальона УДАЛИТЬ API URL

Spring Boot — Thymeleaf

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

Шаблоны с тимьяном

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 должны быть помещены в статический каталог в classpath. В показанном примере мы использовали файл 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>

Исследователь проекта показан на скриншоте ниже.

Скриншот Project Explorer

Теперь нам нужно добавить зависимость 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, как показано ниже:

Запущенное приложение на Tomcat Port_8080

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

HTTP: // локальный: 8080 / индекс

Spring Boot Thymleaf веб-приложение

Использование веб-сервисов RESTful

В этой главе подробно обсуждается использование Web-сервисов 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 {
}

Вы можете определить методы Request 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 в каталоге шаблонов в classpath.

В файле 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 в каталоге шаблонов в classpath.

В 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> 

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

Запущенное приложение на Tomcat Port_8080

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

Http: // Localhost: 8080 / просмотреть продукты

1Honey_2Almond

Http: // Localhost: 8080 / добавить продукты

Отправить форму Spring Boot

Теперь нажмите кнопку Нажмите здесь, чтобы отправить форму, и вы можете увидеть результат, как показано —

Отправить форму Spring Boot Output Window

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

Http: // Localhost: 8080 / просмотреть продукты

1Мед 2Алмонд 3Ginger

Угловой 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");
   });
});

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

Spring Boot — поддержка CORS

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

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

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

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

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

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

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

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

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

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

@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 вы можете обратиться к главе « Использование веб-служб RESTful» этого руководства.

Spring Boot — Интернационализация

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

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

зависимости

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

специалист

<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

Нам нужно определить локаль по умолчанию для вашего приложения. Нам нужно добавить компонент 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 в classpath. Именем файла сообщения локали по умолчанию должно быть message.properties, а файлы для каждой локали должны называться messages_XX.properties . «XX» представляет код локали.

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

Параметры messages.properties по умолчанию будут такими, как показано —

welcome.text=Hi Welcome to Everyone

Французский язык messages_fr.properties будет таким, как показано —

welcome.text=Salut Bienvenue à tous

Примечание. Исходный файл сообщений должен быть сохранен в формате файла «UTF-8».

HTML-файл

В файле HTML используйте синтаксис # {ключ} для отображения сообщений из файла свойств.

<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> 

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

Запущенное приложение на Tomcat Port_8080

Теперь нажмите URL-адрес http: // localhost: 8080 / locale в вашем веб-браузере, и вы увидите следующий результат:

Выходной веб-браузер

URL http: // localhost: 8080 / locale? Language = fr даст вам вывод, как показано —

Выходной веб-браузер Salut Bienvenue

Spring Boot — Планирование

Планирование — это процесс выполнения задач за определенный период времени. 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.

планировщик заданий 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 — Включение HTTPS

По умолчанию приложение Spring Boot использует порт HTTP 8080 при запуске приложения.

Запущенное приложение на Tomcat port_8080

Чтобы настроить HTTPS и порт 443 в приложении Spring Boot, необходимо выполнить приведенные ниже шаги.

  • Получите сертификат SSL — создайте самозаверяющий сертификат или получите его от центра сертификации

  • Включить HTTPS и 443 порт

Получите сертификат SSL — создайте самозаверяющий сертификат или получите его от центра сертификации

Включить HTTPS и 443 порт

Самоподписанный сертификат

Для создания самозаверяющего сертификата среда Java Run Time поставляется в комплекте с утилитой ключей утилиты управления сертификатами. Эта утилита используется для создания самоподписанного сертификата. Это показано в приведенном здесь коде —

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>

Теперь приложение запущено на порт Tomcat 443 с https, как показано на рисунке —

Запущенное приложение на Tomcat Port 443

Spring Boot — Eureka Server

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. Это показано на скриншоте ниже —

Построить сервер 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> 

Вы можете обнаружить, что приложение запущено на порту Tomcat 8761, как показано ниже:

Приложение запущено на Tomcat Port 8761

Теперь нажмите URL-адрес http: // localhost: 8761 / в своем веб-браузере, и вы увидите, что сервер Eureka работает на порту 8761, как показано ниже —

Eureka Server, работающий через порт 8761

Регистрация услуги с помощью Eureka

В этой главе вы узнаете подробно о том, как зарегистрировать приложение-сервис Spring Boot Micro на сервере Eureka. Перед регистрацией приложения убедитесь, что сервер Eureka работает на порту 8761, или сначала соберите сервер Eureka и запустите его. Для получения дополнительной информации о создании сервера 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 Server в нашей конфигурации.

Код для файла 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

Теперь добавьте конечную точку отдыха для возврата 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";
   }
}

Весь файл конфигурации приведен ниже.

Для пользователей 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>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>

Для пользователя 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')
   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> 

Теперь приложение запущено на порт 8080 Tomcat, и клиентское приложение Eureka зарегистрировано на сервере Eureka, как показано ниже:

Запущенное приложение на порт Tomcat

Нажмите URL-адрес http: // localhost: 8761 / в своем веб-браузере, и вы увидите, что клиентское приложение Eureka зарегистрировано на сервере Eureka.

Клиентское приложение Eureka

Теперь нажмите URL-адрес http: // localhost: 8080 / в вашем веб-браузере и посмотрите вывод конечной точки отдыха.

Вывод клиентского приложения Eureka

Spring Boot — Zuul Proxy Server и маршрутизация

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.

Создание приложения на сервере Zuul

Добавьте аннотацию @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 / get и перенаправляется в службу продуктов. Например, / api / demo / products перенаправляется в / products .

Пользователи файла yaml могут использовать файл application.yml, показанный ниже —

server:
   port: 8111
spring:
   application:  
      name: zuulserver
zuul:

routes:
   products:
      path: /api/demo/**
      url: http://localhost:8080/

Примечание. Приложение 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> 

Вы можете найти приложение, запущенное на порту Tomcat 8111, как показано здесь.

Запущенное приложение на Tomcat Port_8111

Теперь перейдите по URL-адресу http: // localhost: 8111 / api / demo / products в вашем веб-браузере, и вы увидите выходные данные / products REST Endpoint, как показано ниже —

Продукты REST Endpoint

Spring Boot — сервер облачной конфигурации

Spring Cloud Configuration Server — это централизованное приложение, которое управляет всеми свойствами конфигурации, связанными с приложением. В этой главе вы подробно узнаете, как создать сервер Spring Cloud Configuration.

Создание Spring Cloud Configuration Server

Сначала загрузите проект Spring Boot со страницы Spring Initializer и выберите зависимость Spring Cloud Config Server. Посмотрите на скриншот, приведенный ниже —

Создание Spring Cloud Configuration 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

Сервер конфигурации работает на порту Tomcat 8888, а свойства конфигурации приложения загружаются из собственных мест поиска.

Теперь в файле: /// C: / configprop / поместите ваше клиентское приложение — файл application.properties. Например, имя вашего клиентского приложения — config-client , затем переименуйте файл application.properties в config-client.properties и поместите файл свойств в файл пути : /// 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> 

Теперь приложение запущено на порт Tomcat 8888, как показано здесь:

Выход Tomcat Port 8888

Теперь нажмите URL-адрес http: // localhost: 8888 / config-client / default / master в веб-браузере, и вы увидите свойства конфигурации приложения config-client, как показано здесь.

Конфиг-Клиентское Приложение

Spring Boot — клиент облачной конфигурации

Некоторым приложениям могут потребоваться свойства конфигурации, которые могут потребовать изменения, и разработчикам может потребоваться их отключить или перезапустить приложение, чтобы выполнить это. Однако это может привести к простою в работе и необходимости перезапуска приложения. Spring Cloud Configuration Server позволяет разработчикам загружать новые свойства конфигурации без перезапуска приложения и без простоев.

Работа с Spring Cloud Configuration Server

Сначала загрузите проект 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 используется для загрузки значения свойств конфигурации с сервера конфигурации.

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 и укажите имя приложения.

Примечание — сервер конфигурации 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, как показано здесь:

Запущенное приложение на Tomcat Port 8080

Вы можете увидеть журнал в окне консоли; Приложение 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 / приветственное сообщение загружено с сервера конфигурации.

Spring Cloud Config Server

Теперь перейдите и измените значение свойства на сервере конфигурации и нажмите POST URL-адрес конечной точки привода 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> 

Теперь приложение запущено на порту Tomcat 8080. Обратите внимание, что если вы указали номер порта управления, то одно и то же приложение будет работать на двух разных номерах портов.

Приложение Startedc на порт Tomcat

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

Конечные точки ИСПОЛЬЗОВАНИЕ
/ метрики Для просмотра метрик приложения, таких как используемая память, свободная память, потоки, классы, время работы системы и т. Д.
/ окр Для просмотра списка переменных среды, используемых в приложении.
/фасоль Для просмотра бобов Spring и их типов, областей и зависимостей.
/здоровье Для просмотра работоспособности приложения
/Информация Для просмотра информации о приложении Spring Boot.
/ след Для просмотра списка следов ваших конечных точек отдыха.

Spring Boot — Admin Server

Мониторинг вашего приложения с помощью конечной точки Spring Boot Actuator немного сложен. Потому что, если у вас есть n приложений, у каждого приложения есть отдельные конечные точки привода, что затрудняет мониторинг. Spring Boot Admin Server — это приложение, используемое для управления и мониторинга вашего приложения Microservice.

Чтобы справиться с такими ситуациями, CodeCentric Team предоставляет пользовательский интерфейс администратора Spring Boot для управления и мониторинга всех конечных точек исполнительного механизма приложения 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

Файл конфигурации сборки приведен ниже.

Для пользователей 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>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>

Для пользователей 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: '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, как показано здесь:

Выход Tomcat Port 9090

Теперь нажмите на приведенный ниже URL-адрес в своем веб-браузере и посмотрите интерфейс пользователя Admin Server.

HTTP: // локальный: 9090 /

Интерфейс администратора веб-браузера

Spring Boot — Admin Client

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

Примечание. Для мониторинга приложения необходимо включить конечные точки 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, как показано на рисунке —

Выход Tomcat Port 9090

Теперь перейдите по следующему URL-адресу в веб-браузере и увидите, что приложение Spring Boot зарегистрировано на Spring Boot Admin Server.

HTTP: // локальный: 9090 /

Spring Boot Admin Server

Теперь нажмите кнопку Details и увидите конечные точки привода в пользовательском интерфейсе Admin Server.

Конечные точки привода в интерфейсе администратора сервера

Spring Boot — Включение Swagger2

Swagger2 — это проект с открытым исходным кодом, используемый для генерации документов API REST для веб-сервисов 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. Нам нужно определить базовый пакет для настройки API REST для 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, как показано на рисунке —

Запущенное приложение на Tomcat Port 8080

Теперь нажмите URL-адрес в своем веб-браузере и посмотрите функциональные возможности Swagger API.

HTTP: // локальный: 8080 / чванство-ui.html

Функциональность Swagger API

Spring Boot — Создание образа Docker

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 добавьте подключаемый модуль 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 Docker пакета mvn: build

Сборщик пакетов MVN

Примечание. Включите демон Expose на tcp: // localhost: 2375 без TLS.

После успешной сборки вы можете увидеть вывод на консоли, как показано ниже —

Выход Docker пакета MVN

Теперь просмотрите изображения Docker по команде с помощью изображений Docker и просмотрите информацию об изображении на консоли.

Команда Docker Images

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

Gradle Build Docker

После выполнения команды вы можете увидеть журнал BUILD SUCCESSFUL в окне консоли.

Docker Build успешно

Теперь просмотрите изображения Docker по команде с помощью изображений Docker и просмотрите информацию об изображении на консоли.

Получить информацию об изображении с помощью DockerImages

Spring Boot — трассировка журналов обслуживания Micro

Большинство разработчиков сталкиваются с трудностями отслеживания журналов, если возникла какая-либо проблема. Это может быть решено с помощью Spring Cloud Sleuth и сервера ZipKin для приложения Spring Boot.

Весеннее Облако

Журналы Spring Cloud Sleuth печатаются в следующем формате —

[application-name,traceid,spanid,zipkin-export]

Куда,

  • Application-name = название приложения

  • Traceid = каждый запрос и ответ traceid одинаковы при вызове одной и той же службы или одной службы другой службе.

  • Spanid = Span Id печатается вместе с Trace Id. Span Id отличается при каждом запросе и ответе, вызывающем один сервис к другому сервису.

  • Zipkin-export = По умолчанию это false. Если это правда, логи будут экспортированы на сервер Zipkin.

Application-name = название приложения

Traceid = каждый запрос и ответ traceid одинаковы при вызове одной и той же службы или одной службы другой службе.

Spanid = Span Id печатается вместе с Trace Id. Span 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> 

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

Запущенное приложение на Tomcat Port 8080

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

HTTP: // локальный: 8080 /

Выходной Добро пожаловать Sleuth

Вы можете увидеть следующие журналы в окне консоли. Обратите внимание, что журнал печатается в следующем формате [имя-приложения, traceid, spanid, zipkin-export]

Журнал печатается

Zipkin Server

Zipkin — это приложение, которое отслеживает и управляет журналами Spring Cloud Sleuth вашего приложения Spring Boot. Чтобы построить сервер Zipkin, нам нужно добавить зависимости пользовательского интерфейса Zipkin и 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> 

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

Выходной порт Tomcat 9411

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

HTTP: // локальный: 9411 / Зипкин /

Пользовательский интерфейс Zipkin сервера

Затем добавьте следующую зависимость в свое приложение-службу клиента и укажите URL-адрес Zipkin Server, чтобы отслеживать журналы микросервиса через пользовательский интерфейс 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')

Теперь добавьте bean-компонент Always Sampler в приложение Spring Boot, чтобы экспортировать журналы на сервер Zipkin.

@Bean
public AlwaysSampler defaultSampler() {
   return new AlwaysSampler();
}

Если вы добавите bean-компонент AlwaysSampler, то параметр экспорта Spring Sleuth Zipkin автоматически изменится с false на true.

Затем настройте базовый URL-адрес сервера Zipkin в файле application.properties клиентской службы.

spring.zipkin.baseUrl = http://localhost:9411/zipkin/ 

Затем укажите идентификатор трассировки и найдите ее в пользовательском интерфейсе Zipkin.

HTTP: // локальный: 9411 / Зипкин / следы / {traceid} /

Весенний ботинок — База данных Flyway

Flyway — это приложение для контроля версий, позволяющее легко и надежно развивать схему базы данных во всех ваших экземплярах. Чтобы узнать больше о Flyway, вы можете воспользоваться ссылкой — www.flywaydb.org

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

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

Настройка базы данных Flyway

Сначала загрузите проект Spring Boot со страницы Spring Initializer www.start.spring.io и выберите следующие зависимости:

  • Spring Boot Starter Web
  • пролетный путь
  • 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 /igration . Назовите файл 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, и в окне консоли вы можете увидеть журналы базы данных flyway, как показано здесь.

Логи базы данных Flyway

Теперь вы можете перейти к базе данных и выполнить запросы выбора.

База данных и выберите запросы

Spring Boot — отправка электронной почты

Используя веб-сервис 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("tutorialspoint@gmail.com", "<your password>");
      }
   });
   Message msg = new MimeMessage(session);
   msg.setFrom(new InternetAddress("tutorialspoint@gmail.com", false));

   msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("tutorialspoint@gmail.com"));
   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";   
}

Примечание. Перед отправкой электронной почты включите, чтобы разрешить использование менее безопасных приложений в настройках учетной записи 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> 

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

Вывод приложения Tomcat Port 8080

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

HTTP: // локальный: 8080 / SendEmail

Окно браузера успешно отправлено

Письмо успешно отправлено

Весенний ботинок — Hystrix

Hystrix — это библиотека от Netflix. Hystrix изолирует точки доступа между сервисами, останавливает каскадные сбои между ними и предоставляет запасные варианты.

Например, когда вы вызываете стороннее приложение, отправка ответа занимает больше времени. Таким образом, в этот момент элемент управления переходит к резервному методу и возвращает пользовательский ответ вашему приложению.

В этой главе вы увидите, как реализовать 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);
   }
}

Теперь напишите простой контроллер отдыха, который возвращает строку через 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

<?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> 

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

Командная строка приложения Tomcat

Теперь нажмите URL-адрес http: // localhost: 8080 / в своем веб-браузере и посмотрите ответ Hystrix. Для ответа API требуется 3 секунды, но время ожидания Hystrix составляет 1 секунду.

Запрос тайм-аута Fail Hystrix

Spring Boot — веб-сокет

В этой главе мы узнаем, как создать интерактивное веб-приложение с помощью 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 отображается для обработки сообщений по назначению «/ привет».

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")
}

Spring Boot — Пакетное обслуживание

Вы можете создать исполняемый файл 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, как показано на рисунке.

Приложение пакетной службы запущено на порту Tomcat

Теперь нажмите URL-адрес http: // localhost: 8080 / в своем веб-браузере, подключите веб-сокет, отправьте приветствие и получите сообщение.

Веб-сокет отправлять и получать сообщения

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

Давайте рассмотрим пример, в котором мы собираемся сохранить содержимое файла CSV в HSQLDB.

Чтобы создать программу Batch Service, нам нужно добавить зависимость 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 в ресурс classpath — src / main / resources и назовите файл как file.csv, как показано на рисунке —

William,John
Mike, Sebastian
Lawarance, Lime

Затем напишите сценарий SQL для HSQLDB — в каталоге ресурсов classpath — 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;
   }
}

Давайте создадим файл конфигурации Batch, чтобы прочитать данные из 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>

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

Пакетный сервис Otput в окне консоли

Весенний ботинок — Apache Kafka

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;
   }
}      

Затем напишите прослушиватель для прослушивания сообщений.

@KafkaListener(topics = "tutorialspoint", groupId = "group-id")
public void listen(String message) {
   System.out.println("Received Messasge in group - group-id: " + message);
}

Давайте вызовем метод sendMessage () из метода run класса 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

Twilio — это стороннее приложение, используемое для отправки SMS и голосовых вызовов из нашего приложения. Это позволяет нам отправлять SMS и делать голосовые звонки программно.

В этой главе вы узнаете, как реализовать отправку SMS-сообщений и выполнение голосовых вызовов с помощью Spring Boot с Twilio.

Примечание. Мы использовали учетную запись 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, нам нужно предоставить метод from-number и to-number методу 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 на свой «номер».

Сообщение получено на «to-number».

Sent from your Twilio trail account
- Message from Spring Boot Application

Примечание. В этом примере мы использовали учетную запись 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.

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

Spring Boot — модульные тесты

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

В этом уроке мы увидим, как написать пример модульного теста с использованием 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 («test») используется для настройки класса во время выполнения тестов.

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 мы можем создать контекст веб-приложения для написания модульного теста для файла Rest Controller.

Модульные тесты должны быть написаны в каталоге src / test / java, а ресурсы classpath для написания теста должны быть помещены в каталог 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.

Во-первых, нам нужно создать файл класса Abstract, используемый для создания контекста веб-приложения, с помощью 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 Test case приведен ниже. Этот 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");
}

Полный файл класса Controller Test приведен ниже —

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 обеспечивает очень хорошую поддержку для создания источника данных для базы данных. Нам не нужно писать дополнительный код для создания источника данных в Spring Boot. Достаточно просто добавить зависимости и выполнить детали конфигурации, чтобы создать источник данных и подключить базу данных.

В этой главе мы будем использовать подключение драйвера 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')

Нам нужно создать файл schema.sql и файл data.sql в каталоге classpath src / main / resources для подключения к базе данных H2.

Файл 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, как показано на рисунке —

База данных и таблицы в 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 {
}

Несколько DataSource

Мы можем хранить «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 — защита веб-приложений

Если на пути к классам добавлена ​​зависимость безопасности 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>

Простое представление / привет, определенное в файле 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")

Теперь создайте файл конфигурации Web 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 — OAuth2 с JWT

В этой главе вы подробно узнаете о механизмах Spring Boot Security и OAuth2 с JWT.

Сервер авторизации

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

Ресурсный сервер

Resource Server — это приложение, которое предоставляет токен доступа клиентам для доступа к конечным точкам HTTP Resource Server. Это коллекция библиотек, которая содержит конечные точки HTTP, статические ресурсы и динамические веб-страницы.

OAuth2

OAuth2 — это структура авторизации, которая позволяет приложению Web Security получать доступ к ресурсам с клиента. Чтобы создать приложение OAuth2, нам нужно сосредоточиться на типе предоставления (код авторизации), идентификаторе клиента и секрете клиента.

JWT Token

JWT Token — это JSON Web Token, используемый для представления требований, защищенных между двумя сторонами. Вы можете узнать больше о токене 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 — хранит пользовательскую информацию для аутентификации и авторизации.

Spring Boot Starter Security — реализует Spring Security

Spring Security OAuth2 — реализует структуру OAUTH2 для включения сервера авторизации и сервера ресурсов.

Spring Security JWT — генерирует токен JWT для веб-безопасности

Spring Boot Starter JDBC — обращается к базе данных, чтобы убедиться, что пользователь доступен или нет.

Spring Boot Starter Web — записывает конечные точки HTTP.

База данных H2 — хранит пользовательскую информацию для аутентификации и авторизации.

Полный файл конфигурации сборки приведен ниже.

<?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 в каталоге classpath resources src / main / resources /, чтобы подключить приложение к базе данных 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, 'tutorialspoint@gmail.com','$2a$08$fL7u5xcvsZl78su29x1ti.dxI.9rYO8t0q5wk2ROJ.1cdR53bmaVG');

INSERT INTO USERS (ID, USERNAME,PASSWORD) VALUES (
   2, 'myemail@gmail.com','$2a$08$fL7u5xcvsZl78su29x1ti.dxI.9rYO8t0q5wk2ROJ.1cdR53bmaVG'); 

Примечание. Пароль должен храниться в формате 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> 

Приложение запускается на порт Tomcat 8080.

Вывод приложения Tomcat Port 8080

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

HTTP: // локальный: 8080 / OAuth / маркер

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

  • Авторизация — базовая аутентификация с вашим идентификатором клиента и секретом клиента.

  • Тип контента — application / x-www-form-urlencoded

Авторизация — базовая аутентификация с вашим идентификатором клиента и секретом клиента.

Тип контента — application / x-www-form-urlencoded

Добавить заголовки запроса

Теперь добавьте параметры запроса следующим образом:

  • grant_type = пароль
  • имя пользователя = ваше имя пользователя
  • пароль = ваш пароль

Добавить параметры запроса

Теперь нажмите API и получите access_token, как показано на рисунке —

Получить токен доступа

Теперь нажмите на Resource Server API с маркером доступа Bearer в заголовке запроса, как показано.

API сервера ресурсов с токеном доступа к каналу

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

OAuth2 с выходом JWT

Spring Boot — облачная платформа Google

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

Сначала загрузите приложение Spring Boot для сборки Gradle со страницы Spring Initializer www.start.spring.io . Посмотрите на следующий скриншот.

Страница инициализатора весны

Теперь в файле build.gradle добавьте плагин appengine для Google Cloud и зависимость пути к классам 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 success, как показано на рисунке —

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» в верхней части страницы.

Активировать Google Cloud Shell

Теперь переместите исходные файлы и файл Gradle в домашний каталог вашего облачного компьютера Google с помощью облачной оболочки Google.

Перемещение в домашний каталог с помощью Google Cloud Shell

Теперь выполните команду gradle appengineDeploy, и она развернет ваше приложение в приложении Google Cloud.

Примечание. В 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>

Примечание. Приложение 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

Spring Boot — вход в Google OAuth2

В этой главе мы рассмотрим, как добавить вход в 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> 

Примечание. В консоли Google Cloud — включите API-интерфейс служб Gmail, Analytics Services и Google+.

Затем перейдите в раздел «Учетные данные», создайте учетные данные и выберите «Идентификатор клиента OAuth».

Секция полномочий

Затем укажите название продукта на экране согласия OAuth2.

Название продукта на экране согласия OAuth2

Затем выберите «Тип приложения» в качестве «Веб-приложения», предоставьте авторизованные источники JavaScript и авторизованные URI перенаправления.

Авторизованные URI перенаправления

Теперь ваш OAuth2 Client Id и Client Secret созданы.

Идентификатор клиента OAuth2 создан

Затем добавьте Client Id и Client Secret в файл свойств вашего приложения.

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>, и приложение будет запущено на порт Tomcat 8080.

Теперь нажмите URL-адрес http: // localhost: 8080 / и нажмите ссылку для входа в Google.

Ссылка для входа в Google

Он будет перенаправлен на экран входа в Google и предоставит данные для входа в Gmail.

Google Login Screen

В случае успешного входа в систему мы получим объект Principal пользователя Gmail.