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, как показано ниже —
Запустите 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, как показано на скриншоте ниже:
После запуска файла groovy необходимые зависимости будут загружены автоматически, и приложение запустится через порт Tomcat 8080, как показано на приведенном ниже снимке экрана.
После запуска Tomcat перейдите в веб-браузер и нажмите URL-адрес http: // localhost: 8080 /, и вы увидите вывод, как показано.
Spring Boot — Самозагрузка
В этой главе объясняется, как выполнить загрузку в приложении Spring Boot.
Spring Initializer
Одним из способов начальной загрузки приложения Spring Boot является использование Spring Initializer. Для этого вам нужно посетить веб-страницу Spring Initializer www.start.spring.io и выбрать свою версию сборки, Spring Boot и платформу. Кроме того, вам нужно предоставить Группу, Артефакт и необходимые зависимости для запуска приложения.
Обратите внимание на следующий снимок экрана, на котором показан пример, в котором мы добавили зависимость spring-boot-starter-web для записи конечных точек REST.
После того как вы указали группу, артефакт, зависимости, проект сборки, платформу и версию, нажмите кнопку « Создать проект» . 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, как показано ниже:
После выполнения команды вы можете увидеть сообщение BUILD SUCCESS в командной строке, как показано ниже —
Используйте команду Gradle gradle clean build, как показано ниже —
После выполнения команды вы можете увидеть сообщение BUILD SUCCESSFUL в командной строке, как показано ниже —
Запустите Hello World с Java
После того, как вы создали исполняемый файл JAR, вы можете найти его в следующих каталогах.
Для Maven вы можете найти файл JAR в целевом каталоге, как показано ниже —
Для Gradle вы можете найти файл JAR в каталоге build / libs, как показано ниже —
Теперь запустите файл JAR с помощью команды java –jar <JARFILE> . Обратите внимание, что в приведенном выше примере файл JAR называется demo-0.0.1-SNAPSHOT.jar.
После того, как вы запустите JAR-файл, вы увидите вывод в окне консоли, как показано ниже —
Теперь, посмотрите на консоль, Tomcat запустил порт 8080 (http). Теперь перейдите в веб-браузер и нажмите URL-адрес http: // localhost: 8080 /, и вы увидите вывод, как показано ниже —
Spring Boot — развертывание 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-файл, и вы сможете найти его в целевом каталоге, как показано на скриншотах ниже:
Для Gradle используйте команду gradle clean build для упаковки вашего приложения. Затем ваш WAR-файл будет создан, и вы сможете найти его в каталоге build / libs . Обратите внимание на скриншоты, приведенные здесь для лучшего понимания —
Развернуть в Tomcat
Теперь запустите сервер Tomcat и разверните файл WAR в каталоге webapps . Посмотрите на скриншоты, показанные здесь, для лучшего понимания —
После успешного развертывания, нажмите на URL в вашем веб-браузере http: // localhost: 8080 / demo-0.0.1-SNAPSHOT / и обратите внимание, что результат будет выглядеть так, как показано на скриншоте ниже —
Полный код для этой цели приведен ниже.
pom.xml
<?xml version = "1.0" encoding = "UTF-8"?> <project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.tutorialspoint</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>demo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <start-class>com.tutorialspoint.demo.DemoApplication</start-class> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
build.gradle
buildscript { ext { springBootVersion = '1.5.8.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' apply plugin: 'war' apply plugin: 'application' group = 'com.tutorialspoint' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 mainClassName = "com.tutorialspoint.demo.DemoApplication" repositories { mavenCentral() } dependencies { compile('org.springframework.boot:spring-boot-starter-web') testCompile('org.springframework.boot:spring-boot-starter-test') }
Код основного файла класса приложения Spring Boot приведен ниже —
package com.tutorialspoint.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.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 показан на рисунке ниже —
Файл 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 является интерфейсом. Он используется для выполнения кода после запуска приложения 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.
Spring Boot — Свойства приложения
Свойства приложения помогают нам работать в разных средах. В этой главе вы узнаете, как настроить и указать свойства для приложения Spring Boot.
Свойства командной строки
Приложение Spring Boot преобразует свойства командной строки в свойства среды Spring Boot. Свойства командной строки имеют приоритет над другими источниками свойств. По умолчанию Spring Boot использует номер порта 8080 для запуска Tomcat. Давайте узнаем, как изменить номер порта с помощью свойств командной строки.
Шаг 1. После создания исполняемого файла JAR запустите его с помощью команды java –jar <JARFILE> .
Шаг 2 — Используйте команду, приведенную на снимке экрана ниже, чтобы изменить номер порта для приложения Spring Boot, используя свойства командной строки.
Примечание. С помощью разделителя можно указать несколько свойств приложения.
Файл свойств
Файлы свойств используются для того, чтобы хранить количество 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. Команда для установки активного профиля пружины показана ниже —
Вы можете увидеть имя активного профиля в журнале консоли, как показано ниже —
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
Команда для установки активного профиля приведена ниже —
Вы можете увидеть имя активного профиля в журнале консоли, как показано ниже —
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 по умолчанию показан на снимке экрана ниже.
которая дает вам следующую информацию —
-
Дата и время, которые дают дату и время журнала
-
Уровень журнала показывает 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); } }
Вывод, который вы видите в окне консоли, показан здесь —
Вывод, который вы можете увидеть в файле журнала, показан здесь —
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, как показано ниже —
Теперь нажмите URL-адрес, показанный ниже в приложении POSTMAN, и посмотрите результат.
GET API URL: http: // localhost: 8080 / products
URL POST API: http: // localhost: 8080 / products
URL PUT API: http: // localhost: 8080 / products / 3
УДАЛИТЬ API URL-адрес: http: // localhost: 8080 / products / 3
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, как показано ниже —
Теперь нажмите на URL-адрес ниже в приложении POSTMAN, и вы увидите результат, как показано ниже —
Обновление URL: http: // localhost: 8080 / products / 3
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, как показано ниже:
Теперь нажмите на приведенный ниже URL-адрес в приложении POSTMAN, и вы увидите результат, как показано ниже
ПОЛУЧИТЬ API: http: // localhost: 8080 / products
В окне консоли вы можете увидеть операторы 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. Это должно выглядеть так, как показано ниже —
Затем вы можете увидеть Удаленный хост и Удаленный адрес в журнале консоли, как показано ниже —
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.
Теперь нажмите на URL-адреса ниже в приложении POSTMAN, и вы увидите результат.
ПОЛУЧИТЬ Продукты по шаблону отдыха — http: // localhost: 8080 / template / products
Создание продуктов POST — http: // localhost: 8080 / template / products
Обновление продукта PUT — http: // localhost: 8080 / template / products / 3
Удалить продукт — http: // localhost: 8080 / template / products / 3
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
Загрузка файла — 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
URL POST API — http: // localhost: 8080 / products
URL PUT API — http: // localhost: 8080 / products / 3
УДАЛИТЬ API URL-адрес — http: // localhost: 8080 / products / 3
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>
Исследователь проекта показан на скриншоте ниже.
Теперь нам нужно добавить зависимость Spring Boot Starter Thymeleaf в наш файл конфигурации сборки.
Пользователи Maven могут добавить следующую зависимость в файл pom.xml:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
Пользователи Gradle могут добавить следующую зависимость в файл build.gradle:
compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf'
Код основного файла класса приложения Spring Boot приведен ниже —
package com.tutorialspoint.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
Код для Maven — pom.xml приведен ниже —
<?xml version = "1.0" encoding = "UTF-8"?> <project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.tutorialspoint</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>demo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath /> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Код для Gradle — build.gradle приведен ниже —
buildscript { ext { springBootVersion = '1.5.8.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' group = 'com.tutorialspoint' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { compile('org.springframework.boot:spring-boot-starter-web') compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf' testCompile('org.springframework.boot:spring-boot-starter-test') }
Вы можете создать исполняемый файл JAR и запустить приложение весенней загрузки, используя следующие команды Maven или Gradle:
Для Maven используйте команду как показано ниже —
mvn clean install
После «BUILD SUCCESS» вы можете найти файл JAR в целевом каталоге.
Для Gradle используйте команду как показано ниже —
gradle clean build
После «BUILD SUCCESSFUL» вы можете найти файл JAR в каталоге build / libs.
Запустите файл JAR, используя приведенную здесь команду —
java –jar <JARFILE>
Теперь приложение запущено на порт 8080 Tomcat, как показано ниже:
Теперь нажмите URL в вашем веб-браузере, и вы увидите результат, как показано на рисунке —
HTTP: // локальный: 8080 / индекс
Использование веб-сервисов 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.
Теперь нажмите URL в вашем веб-браузере, и вы увидите результат, как показано на рисунке —
Http: // Localhost: 8080 / просмотреть продукты
Http: // Localhost: 8080 / добавить продукты
Теперь нажмите кнопку Нажмите здесь, чтобы отправить форму, и вы можете увидеть результат, как показано —
Теперь нажмите URL-адрес для просмотра продуктов и посмотрите созданный продукт.
Http: // Localhost: 8080 / просмотреть продукты
Угловой 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.
Теперь нажмите URL-адрес http: // localhost: 8080 / locale в вашем веб-браузере, и вы увидите следующий результат:
URL http: // localhost: 8080 / locale? Language = fr даст вам вывод, как показано —
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.
Фиксированная ставка
Планировщик с фиксированной скоростью используется для выполнения задач в определенное время. Он не ждет завершения предыдущего задания. Значения должны быть в миллисекундах. Пример кода показан здесь —
@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 при запуске приложения.
Чтобы настроить 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, как показано на рисунке —
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. Это показано на скриншоте ниже —
После загрузки проекта в основной файл класса 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, как показано ниже:
Теперь нажмите URL-адрес http: // localhost: 8761 / в своем веб-браузере, и вы увидите, что сервер Eureka работает на порту 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, как показано ниже:
Нажмите URL-адрес http: // localhost: 8761 / в своем веб-браузере, и вы увидите, что клиентское приложение Eureka зарегистрировано на сервере Eureka.
Теперь нажмите URL-адрес http: // localhost: 8080 / в вашем веб-браузере и посмотрите вывод конечной точки отдыха.
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.
Добавьте аннотацию @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, как показано здесь.
Теперь перейдите по URL-адресу http: // localhost: 8111 / api / demo / products в вашем веб-браузере, и вы увидите выходные данные / products 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 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, как показано здесь:
Теперь нажмите 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, как показано здесь:
Вы можете увидеть журнал в окне консоли; Приложение 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 / приветственное сообщение загружено с сервера конфигурации.
Теперь перейдите и измените значение свойства на сервере конфигурации и нажмите 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. Обратите внимание, что если вы указали номер порта управления, то одно и то же приложение будет работать на двух разных номерах портов.
Некоторые важные конечные точки привода пружинной загрузки приведены ниже. Вы можете ввести их в свой веб-браузер и следить за поведением вашего приложения.
Конечные точки | ИСПОЛЬЗОВАНИЕ |
---|---|
/ метрики | Для просмотра метрик приложения, таких как используемая память, свободная память, потоки, классы, время работы системы и т. Д. |
/ окр | Для просмотра списка переменных среды, используемых в приложении. |
/фасоль | Для просмотра бобов 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, как показано здесь:
Теперь нажмите на приведенный ниже 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, как показано на рисунке —
Теперь перейдите по следующему URL-адресу в веб-браузере и увидите, что приложение Spring Boot зарегистрировано на Spring Boot Admin Server.
HTTP: // локальный: 9090 /
Теперь нажмите кнопку 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, как показано на рисунке —
Теперь нажмите URL-адрес в своем веб-браузере и посмотрите функциональные возможности Swagger API.
HTTP: // локальный: 8080 / чванство-ui.html
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
Примечание. Включите демон Expose на tcp: // localhost: 2375 без TLS.
После успешной сборки вы можете увидеть вывод на консоли, как показано ниже —
Теперь просмотрите изображения Docker по команде с помощью изображений Docker и просмотрите информацию об изображении на консоли.
Gradle
Чтобы построить образ Docker с помощью конфигурации сборки Gradle, нам нужно добавить плагин docker и написать задачу buildDocker для создания образа Docker.
Код для настройки Gradle Docker приведен ниже.
buildscript { ..... dependencies { ..... classpath('se.transmode.gradle:gradle-docker:1.2') } } group = 'spring-boot-tutorialspoint' ..... apply plugin: 'docker' task buildDocker(type: Docker, dependsOn: build) { applicationName = jar.baseName dockerfile = file('src/main/docker/Dockerfile') doFirst { copy { from jar into stageDir } } }
Полный файл build.gradle приведен ниже.
buildscript { ext { springBootVersion = '1.5.9.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") classpath('se.transmode.gradle:gradle-docker:1.2') } } group = 'spring-boot-tutorialspoint' apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' apply plugin: 'docker' group = 'com.tutorialspoint' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { compile('org.springframework.boot:spring-boot-starter-web') testCompile('org.springframework.boot:spring-boot-starter-test') } task buildDocker(type: Docker, dependsOn: build) { applicationName = jar.baseName dockerfile = file('src/main/docker/Dockerfile') doFirst { copy { from jar into stageDir } } }
Теперь создайте образ Docker с помощью команды, показанной ниже —
gradle build buildDocker
После выполнения команды вы можете увидеть журнал BUILD SUCCESSFUL в окне консоли.
Теперь просмотрите изображения Docker по команде с помощью изображений Docker и просмотрите информацию об изображении на консоли.
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.
Теперь нажмите URL-адрес в веб-браузере и просмотрите результаты в журнале консоли.
HTTP: // локальный: 8080 /
Вы можете увидеть следующие журналы в окне консоли. Обратите внимание, что журнал печатается в следующем формате [имя-приложения, 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, как показано ниже:
Теперь перейдите по указанному ниже URL-адресу и увидите пользовательский интерфейс Zipkin-сервера.
HTTP: // локальный: 9411 / Зипкин /
Затем добавьте следующую зависимость в свое приложение-службу клиента и укажите 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, как показано здесь.
Теперь вы можете перейти к базе данных и выполнить запросы выбора.
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("[email protected]", "<your password>"); } }); Message msg = new MimeMessage(session); msg.setFrom(new InternetAddress("[email protected]", false)); msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("[email protected]")); msg.setSubject("Tutorials point email"); msg.setContent("Tutorials point email", "text/html"); msg.setSentDate(new Date()); MimeBodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setContent("Tutorials point email", "text/html"); Multipart multipart = new MimeMultipart(); multipart.addBodyPart(messageBodyPart); MimeBodyPart attachPart = new MimeBodyPart(); attachPart.attachFile("/var/tmp/image19.png"); multipart.addBodyPart(attachPart); msg.setContent(multipart); Transport.send(msg); }
Теперь вызовите вышеупомянутый метод sendmail () из Rest API, как показано ниже —
@RequestMapping(value = "/sendemail") public String sendEmail() throws AddressException, MessagingException, IOException { sendmail(); return "Email sent successfully"; }
Примечание. Перед отправкой электронной почты включите, чтобы разрешить использование менее безопасных приложений в настройках учетной записи 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.
Теперь перейдите по следующему 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, как показано ниже —
Теперь нажмите URL-адрес http: // localhost: 8080 / в своем веб-браузере и посмотрите ответ Hystrix. Для ответа API требуется 3 секунды, но время ожидания Hystrix составляет 1 секунду.
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, как показано на рисунке.
Теперь нажмите 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>
Вы можете увидеть вывод в окне консоли, как показано на рисунке —
Весенний ботинок — 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, как показано на рисунке —
Для пользователей файла свойств добавьте следующие свойства в файл 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, '[email protected]','$2a$08$fL7u5xcvsZl78su29x1ti.dxI.9rYO8t0q5wk2ROJ.1cdR53bmaVG'); INSERT INTO USERS (ID, USERNAME,PASSWORD) VALUES ( 2, '[email protected]','$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.
Теперь нажмите 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 в заголовке запроса, как показано.
Затем вы можете увидеть результат, как показано ниже —
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» в верхней части страницы.
Теперь переместите исходные файлы и файл Gradle в домашний каталог вашего облачного компьютера Google с помощью облачной оболочки Google.
Теперь выполните команду 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.
Затем выберите «Тип приложения» в качестве «Веб-приложения», предоставьте авторизованные источники JavaScript и авторизованные URI перенаправления.
Теперь ваш OAuth2 Client Id и Client Secret созданы.
Затем добавьте 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 и предоставит данные для входа в Gmail.
В случае успешного входа в систему мы получим объект Principal пользователя Gmail.