Spring Boot - Hướng dẫn nhanh
Spring Boot là một framework dựa trên Java mã nguồn mở được sử dụng để tạo một Dịch vụ vi mô. Nó được phát triển bởi Pivotal Team và được sử dụng để xây dựng các ứng dụng mùa xuân độc lập và sẵn sàng sản xuất. Chương này sẽ giới thiệu cho bạn về Spring Boot và giúp bạn làm quen với các khái niệm cơ bản của nó.
Dịch vụ vi mô là gì?
Dịch vụ vi mô là một kiến trúc cho phép các nhà phát triển phát triển và triển khai các dịch vụ một cách độc lập. Mỗi dịch vụ đang chạy có quy trình riêng và điều này đạt được mô hình nhẹ để hỗ trợ các ứng dụng kinh doanh.
Ưu điểm
Các dịch vụ vi mô cung cấp những lợi thế sau cho các nhà phát triển của nó:
- Triển khai dễ dàng
- Khả năng mở rộng đơn giản
- Tương thích với Container
- Cấu hình tối thiểu
- Thời gian sản xuất ít hơn
Spring Boot là gì?
Spring Boot cung cấp một nền tảng tốt cho các nhà phát triển Java để phát triển một ứng dụng mùa xuân độc lập và cấp sản xuất mà bạn có thể just run. Bạn có thể bắt đầu với các cấu hình tối thiểu mà không cần thiết lập toàn bộ cấu hình Spring.
Ưu điểm
Spring Boot cung cấp những ưu điểm sau cho các nhà phát triển của nó:
- Dễ hiểu và phát triển các ứng dụng mùa xuân
- Tăng năng suất
- Giảm thời gian phát triển
Bàn thắng
Spring Boot được thiết kế với các mục tiêu sau:
- Để tránh cấu hình XML phức tạp trong Spring
- Để phát triển các ứng dụng Spring sẵn sàng cho sản xuất theo cách dễ dàng hơn
- Để giảm thời gian phát triển và chạy ứng dụng một cách độc lập
- Cung cấp một cách dễ dàng hơn để bắt đầu với ứng dụng
Tại sao nên sử dụng Spring Boot?
Bạn có thể chọn Spring Boot vì các tính năng và lợi ích mà nó mang lại như được đưa ra ở đây -
Nó cung cấp một cách linh hoạt để cấu hình Java Beans, cấu hình XML và Giao dịch cơ sở dữ liệu.
Nó cung cấp một xử lý hàng loạt mạnh mẽ và quản lý các điểm cuối REST.
Trong Spring Boot, mọi thứ đều được cấu hình tự động; không cần cấu hình thủ công.
Nó cung cấp ứng dụng mùa xuân dựa trên chú thích
Dễ dàng quản lý sự phụ thuộc
Nó bao gồm Bộ chứa Servlet được nhúng
Làm thế nào nó hoạt động?
Spring Boot tự động định cấu hình ứng dụng của bạn dựa trên các phụ thuộc bạn đã thêm vào dự án bằng cách sử dụng @EnableAutoConfigurationchú thích. Ví dụ: nếu cơ sở dữ liệu MySQL nằm trên classpath của bạn, nhưng bạn chưa định cấu hình bất kỳ kết nối cơ sở dữ liệu nào, thì Spring Boot sẽ tự động cấu hình cơ sở dữ liệu trong bộ nhớ.
Điểm vào của ứng dụng khởi động mùa xuân là lớp chứa @SpringBootApplication chú thích và phương thức chính.
Spring Boot tự động quét tất cả các thành phần có trong dự án bằng cách sử dụng @ComponentScan chú thích.
Khởi động Spring Boot
Xử lý quản lý phụ thuộc là một nhiệm vụ khó khăn đối với các dự án lớn. Spring Boot giải quyết vấn đề này bằng cách cung cấp một tập hợp các phụ thuộc để các nhà phát triển thuận tiện.
Ví dụ: nếu bạn muốn sử dụng Spring và JPA để truy cập cơ sở dữ liệu, chỉ cần bạn bao gồm spring-boot-starter-data-jpa phụ thuộc vào dự án của bạn.
Lưu ý rằng tất cả các trình khởi động Spring Boot đều tuân theo cùng một mẫu đặt tên spring-boot-starter- *, trong đó * chỉ ra rằng đó là một loại ứng dụng.
Ví dụ
Hãy xem phần khởi động Spring Boot sau được giải thích bên dưới để hiểu rõ hơn -
Spring Boot Starter Actuator dependencyđược sử dụng để giám sát và quản lý ứng dụng của bạn. Mã của nó được hiển thị bên dưới -
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Spring Boot Starter Security dependencyđược sử dụng cho Spring Security. Mã của nó được hiển thị bên dưới -
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Spring Boot Starter web dependencyđược sử dụng để viết Điểm cuối nghỉ. Mã của nó được hiển thị bên dưới -
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Spring Boot Starter Thyme Leaf dependencyđược sử dụng để tạo một ứng dụng web. Mã của nó được hiển thị bên dưới -
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Spring Boot Starter Test dependencyđược sử dụng để viết các trường hợp kiểm thử. Mã của nó được hiển thị bên dưới -
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
Cấu hình tự động
Spring Boot Auto Configuration tự động cấu hình ứng dụng Spring của bạn dựa trên các phụ thuộc JAR mà bạn đã thêm vào trong dự án. Ví dụ: nếu cơ sở dữ liệu MySQL nằm trên đường dẫn lớp của bạn, nhưng bạn chưa định cấu hình bất kỳ kết nối cơ sở dữ liệu nào, thì Spring Boot sẽ tự động cấu hình cơ sở dữ liệu trong bộ nhớ.
Với mục đích này, bạn cần thêm @EnableAutoConfiguration chú thích hoặc @SpringBootApplicationchú thích cho tệp lớp chính của bạn. Sau đó, ứng dụng Spring Boot của bạn sẽ được tự động cấu hình.
Hãy quan sát đoạn mã sau để hiểu rõ hơn:
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);
}
}
Ứng dụng khởi động mùa xuân
Điểm vào của Ứng dụng khởi động mùa xuân là lớp chứa @SpringBootApplicationchú thích. Lớp này phải có phương thức chính để chạy ứng dụng Spring Boot.@SpringBootApplication chú thích bao gồm Tự động cấu hình, Quét thành phần và Cấu hình khởi động mùa xuân.
Nếu bạn đã thêm @SpringBootApplication chú thích cho lớp, bạn không cần thêm @EnableAutoConfiguration, @ComponentScan và @SpringBootConfigurationchú thích. Các@SpringBootApplication chú thích bao gồm tất cả các chú thích khác.
Hãy quan sát đoạn mã sau để hiểu rõ hơn:
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);
}
}
Quét thành phần
Ứng dụng Spring Boot quét tất cả các bean và khai báo gói khi ứng dụng khởi chạy. Bạn cần thêm@ComponentScan chú thích cho tệp lớp của bạn để quét các thành phần được thêm vào dự án của bạn.
Hãy quan sát đoạn mã sau để hiểu rõ hơn:
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);
}
}
Chương này sẽ hướng dẫn bạn cách tạo một ứng dụng Spring Boot bằng Maven và Gradle.
Điều kiện tiên quyết
Hệ thống của bạn cần có các yêu cầu tối thiểu sau để tạo ứng dụng Spring Boot -
- Java 7
- Maven 3.2
- Gradle 2,5
Spring Boot CLI
Spring Boot CLI là một công cụ dòng lệnh và nó cho phép chúng ta chạy các tập lệnh Groovy. Đây là cách dễ nhất để tạo ứng dụng Spring Boot bằng cách sử dụng Giao diện dòng lệnh Spring Boot. Bạn có thể tạo, chạy và kiểm tra ứng dụng trong chính dấu nhắc lệnh.
Phần này giải thích cho bạn các bước liên quan đến cài đặt thủ công Spring Boot CLI. Để được trợ giúp thêm, bạn có thể sử dụng liên kết sau:https://docs.spring.io/springboot/ docs/current-SNAPSHOT/reference/htmlsingle/#getting-started-installing-springboot
Bạn cũng có thể tải xuống bản phân phối Spring CLI từ kho phần mềm Spring tại: https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#getting-started-manual-cli-installation
Để cài đặt thủ công, bạn cần sử dụng hai thư mục sau:
spring-boot-cli-2.0.0.BUILD-SNAPSHOT-bin.zip
spring-boot-cli-2.0.0.BUILD-SNAPSHOT-bin.tar.gz
Sau khi tải xuống, hãy giải nén tệp lưu trữ và làm theo các bước được cung cấp trong tệp install.txt. Không phải là nó không yêu cầu bất kỳ thiết lập môi trường nào.
Trong Windows, đi tới Spring Boot CLI bin thư mục trong dấu nhắc lệnh và chạy lệnh spring –-versionđể đảm bảo CLI lò xo được cài đặt chính xác. Sau khi thực hiện lệnh, bạn có thể thấy phiên bản CLI mùa xuân như hình dưới đây:
Chạy Hello World với Groovy
Tạo một tệp Groovy đơn giản chứa script Rest Endpoint và chạy tệp groovy với Spring boot CLI. Quan sát mã hiển thị ở đây cho mục đích này -
@Controller
class Example {
@RequestMapping("/")
@ResponseBody
public String hello() {
"Hello Spring Boot"
}
}
Bây giờ, hãy lưu tệp thú vị với tên hello.groovy. Lưu ý rằng trong ví dụ này, chúng tôi đã lưu tệp Groovy bên trong Spring Boot CLIbindanh mục. Bây giờ hãy chạy ứng dụng bằng cách sử dụng lệnhspring run hello.groovy như thể hiện trong ảnh chụp màn hình dưới đây -
Khi bạn chạy tệp groovy, các phần phụ thuộc bắt buộc sẽ tự động tải xuống và nó sẽ khởi động ứng dụng trong cổng Tomcat 8080 như được hiển thị trong ảnh chụp màn hình bên dưới -
Khi Tomcat khởi động, hãy truy cập trình duyệt web và nhấn vào URL http://localhost:8080/ và bạn có thể thấy đầu ra như hình.
Chương này sẽ giải thích cho bạn cách thực hiện khởi động trên ứng dụng Spring Boot.
Spring Initializer
Một trong những cách để khởi động ứng dụng Spring Boot là sử dụng Spring Initializer. Để thực hiện việc này, bạn sẽ phải truy cập trang web của Spring Initializer www.start.spring.io và chọn phiên bản Build, Spring Boot và nền tảng của bạn. Ngoài ra, bạn cần cung cấp Nhóm, Tạo tác và các phụ thuộc bắt buộc để chạy ứng dụng.
Quan sát ảnh chụp màn hình sau đây cho thấy một ví dụ mà chúng tôi đã thêm spring-boot-starter-web phụ thuộc để ghi các điểm cuối REST.
Sau khi bạn cung cấp Nhóm, Phần mềm, Phụ thuộc, Dự án Xây dựng, Nền tảng và Phiên bản, hãy nhấp vào Generate Projectcái nút. Tệp zip sẽ tải xuống và các tệp sẽ được giải nén.
Phần này giải thích cho bạn các ví dụ bằng cách sử dụng cả Maven và Gradle.
Maven
Sau khi bạn tải xuống dự án, hãy giải nén tệp. Bây giờ, của bạnpom.xml tệp trông như hình dưới đây -
<?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
Sau khi bạn tải xuống dự án, hãy giải nén tệp. Bây giờ của bạnbuild.gradle tệp trông như hình dưới đây -
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')
}
Sự phụ thuộc của đường dẫn lớp
Spring Boot cung cấp một số Startersđể thêm các lọ trong đường dẫn lớp của chúng ta. Ví dụ: để viết Điểm cuối nghỉ, chúng ta cần thêmspring-boot-starter-webphụ thuộc vào đường dẫn lớp của chúng ta. Quan sát các mã được hiển thị bên dưới để hiểu rõ hơn -
Maven phụ thuộc
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
Gradle phụ thuộc
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
}
Phương pháp chính
Phương thức chính nên viết lớp Ứng dụng khởi động mùa xuân. Lớp này nên được chú thích bằng@SpringBootApplication. Đây là điểm vào của ứng dụng khởi động mùa xuân để bắt đầu. Bạn có thể tìm thấy tệp lớp chính trongsrc/java/main thư mục với gói mặc định.
Trong ví dụ này, tệp lớp chính được đặt tại src/java/main thư mục với gói mặc định com.tutorialspoint.demo. Quan sát mã hiển thị ở đây để hiểu rõ hơn -
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);
}
}
Viết điểm cuối còn lại
Để viết một Hello World Rest Endpoint đơn giản trong tệp lớp chính của Ứng dụng Spring Boot, hãy làm theo các bước được hiển thị bên dưới:
Đầu tiên, hãy thêm @RestController chú thích ở đầu lớp.
Bây giờ, hãy viết một phương thức URI yêu cầu với @RequestMapping chú thích.
Sau đó, phương thức URI yêu cầu sẽ trả về Hello World chuỗi.
Bây giờ, tệp lớp Ứng dụng khởi động mùa xuân chính của bạn sẽ trông giống như được hiển thị trong đoạn mã dưới đây:
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";
}
}
Tạo một JAR có thể thực thi
Hãy để chúng tôi tạo một tệp JAR thực thi để chạy ứng dụng Spring Boot bằng cách sử dụng lệnh Maven và Gradle trong dấu nhắc lệnh như hình dưới đây:
Sử dụng lệnh Maven mvn clean install như hình dưới đây -
Sau khi thực hiện lệnh, bạn có thể thấy BUILD SUCCESS tại dấu nhắc lệnh như hình dưới đây -
Sử dụng lệnh Gradle gradle clean build như hình dưới đây -
Sau khi thực hiện lệnh, bạn có thể thấy BUILD SUCCESSFUL trong dấu nhắc lệnh như hình dưới đây -
Chạy Hello World với Java
Khi bạn đã tạo một tệp JAR thực thi, bạn có thể tìm thấy nó trong các thư mục sau.
Đối với Maven, bạn có thể tìm thấy tệp JAR trong thư mục đích như hình dưới đây -
Đối với Gradle, bạn có thể tìm thấy tệp JAR trong build/libs thư mục như hình dưới đây -
Bây giờ, hãy chạy tệp JAR bằng cách sử dụng lệnh java –jar <JARFILE>. Quan sát rằng trong ví dụ trên, tệp JAR được đặt tên làdemo-0.0.1-SNAPSHOT.jar
Sau khi chạy tệp jar, bạn có thể thấy kết quả đầu ra trong cửa sổ bảng điều khiển như hình dưới đây:
Bây giờ, hãy nhìn vào bảng điều khiển, Tomcat đã bắt đầu trên cổng 8080 (http). Bây giờ, hãy truy cập trình duyệt web và nhấn vào URLhttp://localhost:8080/ và bạn có thể thấy kết quả như hình dưới đây -
Bằng cách sử dụng ứng dụng Spring Boot, chúng ta có thể tạo một tệp war để triển khai vào máy chủ web. Trong chương này, bạn sẽ tìm hiểu cách tạo tệp WAR và triển khai ứng dụng Spring Boot trong máy chủ web Tomcat.
Bộ khởi động Spring Boot Servlet
Cách triển khai truyền thống là tạo Ứng dụng khởi động mùa xuân @SpringBootApplication mở rộng lớp học SpringBootServletInitializerlớp học. Tệp lớp Spring Boot Servlet Initializer cho phép bạn định cấu hình ứng dụng khi nó được khởi chạy bằng cách sử dụng Servlet Container.
Mã cho tệp lớp Ứng dụng khởi động mùa xuân để triển khai tệp JAR được cung cấp bên dưới:
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);
}
}
Chúng ta cần mở rộng lớp học SpringBootServletInitializerđể hỗ trợ triển khai tệp WAR. Mã của tệp lớp Ứng dụng Spring Boot được đưa ra dưới đây:
package com.tutorialspoint.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(DemoApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Đặt lớp chính
Trong Spring Boot, chúng ta cần đề cập đến lớp chính sẽ bắt đầu trong tệp xây dựng. Với mục đích này, bạn có thể sử dụng các đoạn mã sau:
Đối với Maven, hãy thêm lớp bắt đầu vào pom.xml thuộc tính như hình dưới đây -
<start-class>com.tutorialspoint.demo.DemoApplication</start-class>
Đối với Gradle, thêm tên lớp chính trong build.gradle như hình dưới đây:
mainClassName="com.tutorialspoint.demo.DemoApplication"
Cập nhật JAR đóng gói thành WAR
Chúng tôi phải cập nhật JAR đóng gói thành WAR bằng cách sử dụng các đoạn mã sau:
Đối với Maven, thêm bao bì là WAR trong pom.xml như hình dưới đây -
<packaging>war</packaging>
Đối với Gradle, hãy thêm plugin ứng dụng và plugin chiến tranh trong build.gradle như hình dưới đây -
apply plugin: ‘war’
apply plugin: ‘application’
Bây giờ, chúng ta hãy viết một Rest Endpoint đơn giản để trả về chuỗi “Hello World from Tomcat”. Để viết Rest Endpoint, chúng ta cần thêm phần phụ thuộc vào bộ khởi động web Spring Boot vào tệp xây dựng của chúng ta.
Đối với Maven, thêm phần phụ thuộc vào bộ khởi động Spring Boot trong pom.xml bằng cách sử dụng mã như hình dưới đây:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Đối với Gradle, hãy thêm phần phụ thuộc vào bộ khởi động Spring Boot trong build.gradle sử dụng mã như hình dưới đây -
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
}
Bây giờ, viết một Rest Endpoint đơn giản trong tệp lớp Spring Boot Application bằng cách sử dụng mã như hình dưới đây -
package com.tutorialspoint.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class DemoApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(DemoApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@RequestMapping(value = "/")
public String hello() {
return "Hello World from Tomcat";
}
}
Đóng gói ứng dụng của bạn
Bây giờ, hãy tạo tệp WAR để triển khai vào máy chủ Tomcat bằng cách sử dụng lệnh Maven và Gradle để đóng gói ứng dụng của bạn như được cung cấp bên dưới:
Đối với Maven, hãy sử dụng lệnh mvn packageđể đóng gói ứng dụng của bạn. Sau đó, tệp WAR sẽ được tạo và bạn có thể tìm thấy nó trong thư mục đích như được hiển thị trong ảnh chụp màn hình dưới đây:
Đối với Gradle, hãy sử dụng lệnh gradle clean buildđể đóng gói ứng dụng của bạn. Sau đó, tệp WAR của bạn sẽ được tạo và bạn có thể tìm thấy nó trongbuild/libsdanh mục. Quan sát ảnh chụp màn hình được cung cấp ở đây để hiểu rõ hơn -
Triển khai vào Tomcat
Bây giờ, hãy chạy Máy chủ Tomcat và triển khai tệp WAR trong webappsdanh mục. Quan sát ảnh chụp màn hình được hiển thị ở đây để hiểu rõ hơn -
Sau khi triển khai thành công, hãy nhấn vào URL trong trình duyệt web của bạn http://localhost:8080/demo-0.0.1-SNAPSHOT/ và quan sát rằng đầu ra sẽ trông như thể hiện trong ảnh chụp màn hình dưới đây -
Mã đầy đủ cho mục đích này được đưa ra dưới đây.
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')
}
Mã cho tệp lớp ứng dụng Spring Boot chính được cung cấp bên dưới:
package com.tutorialspoint.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class DemoApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(DemoApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@RequestMapping(value = "/")
public String hello() {
return "Hello World from Tomcat";
}
}
Trong Spring Boot, chọn một hệ thống xây dựng là một nhiệm vụ quan trọng. Chúng tôi đề xuất Maven hoặc Gradle vì chúng hỗ trợ tốt cho việc quản lý sự phụ thuộc. Spring không hỗ trợ tốt các hệ thống xây dựng khác.
Quản lý sự phụ thuộc
Nhóm Spring Boot cung cấp danh sách các phụ thuộc để hỗ trợ phiên bản Spring Boot cho mọi bản phát hành. Bạn không cần cung cấp phiên bản cho các phần phụ thuộc trong tệp cấu hình bản dựng. Spring Boot tự động cấu hình phiên bản phụ thuộc dựa trên bản phát hành. Hãy nhớ rằng khi bạn nâng cấp phiên bản Spring Boot, các phần phụ thuộc cũng sẽ tự động nâng cấp.
Note- Nếu bạn muốn chỉ định phiên bản cho phụ thuộc, bạn có thể chỉ định nó trong tệp cấu hình của mình. Tuy nhiên, nhóm Spring Boot thực sự khuyến cáo rằng không cần chỉ định phiên bản để phụ thuộc.
Maven phụ thuộc
Đối với cấu hình Maven, chúng ta nên kế thừa dự án mẹ Spring Boot Starter để quản lý các phụ thuộc Spring Boot Starters. Đối với điều này, đơn giản là chúng ta có thể kế thừa cha mẹ bắt đầu trongpom.xml như hình bên dưới.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
</parent>
Chúng ta nên chỉ định số phiên bản cho phụ thuộc Spring Boot Parent Starter. Sau đó, đối với các phụ thuộc khởi động khác, chúng ta không cần chỉ định số phiên bản Spring Boot. Quan sát đoạn mã dưới đây -
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
Sự phụ thuộc Gradle
Chúng ta có thể nhập trực tiếp các phụ thuộc Spring Boot Starters vào build.gradletập tin. Chúng ta không cần khởi động Spring Boot Phụ thuộc cha mẹ như Maven cho Gradle. Quan sát đoạn mã dưới đây -
buildscript {
ext {
springBootVersion = '1.5.8.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
Tương tự, trong Gradle, chúng ta không cần chỉ định số phiên bản Spring Boot cho các phụ thuộc. Spring Boot tự động cấu hình phần phụ thuộc dựa trên phiên bản.
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
}
Spring Boot không có bất kỳ bố cục mã nào để làm việc. Tuy nhiên, có một số phương pháp hay nhất sẽ giúp ích cho chúng ta. Chương này nói về chúng một cách chi tiết.
Gói mặc định
Một lớp không có bất kỳ khai báo gói nào được coi là default package. Lưu ý rằng thường không nên khai báo gói mặc định. Spring Boot sẽ gây ra các vấn đề như hoạt động sai cấu hình tự động hoặc quét thành phần, khi bạn sử dụng gói mặc định.
Note- Quy ước đặt tên được đề xuất của Java cho khai báo gói là tên miền đảo ngược. Ví dụ -com.tutorialspoint.myproject
Bố cục điển hình
Bố cục điển hình của ứng dụng Spring Boot được hiển thị trong hình dưới đây:
Tệp Application.java nên khai báo phương thức chính cùng với @SpringBootApplication. Hãy quan sát đoạn mã dưới đây để hiểu rõ hơn -
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);}
}
Trong Spring Boot, chúng ta có thể sử dụng Spring Framework để xác định các bean của chúng ta và việc tiêm phụ thuộc của chúng. Các@ComponentScan chú thích được sử dụng để tìm đậu và tương ứng được tiêm @Autowired chú thích.
Nếu bạn đã làm theo bố cục điển hình của Spring Boot, không cần chỉ định bất kỳ đối số nào cho @ComponentScanchú thích. Tất cả các tệp lớp thành phần được đăng ký tự động với Spring Beans.
Ví dụ sau cung cấp ý tưởng về Tự động nối dây đối tượng Rest Template và tạo Bean cho giống nhau -
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
Đoạn mã sau đây hiển thị mã cho đối tượng Rest Template có dây tự động và đối tượng tạo Bean trong tệp lớp Ứng dụng Spring Boot chính:
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();
}
}
Giao diện Application Runner và Command Line Runner cho phép bạn thực thi mã sau khi khởi động ứng dụng Spring Boot. Bạn có thể sử dụng các giao diện này để thực hiện bất kỳ hành động nào ngay sau khi ứng dụng khởi động. Chương này nói về chúng một cách chi tiết.
Người chạy ứng dụng
Application Runner là một giao diện được sử dụng để thực thi mã sau khi ứng dụng Spring Boot khởi động. Ví dụ dưới đây cho thấy cách triển khai giao diện Application Runner trên tệp lớp chính.
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");
}
}
Bây giờ, nếu bạn quan sát cửa sổ bảng điều khiển bên dưới Hello World from Application Runner, câu lệnh println được thực thi sau khi Tomcat khởi động. Ảnh chụp màn hình sau có liên quan không?
Người chạy dòng lệnh
Command Line Runner là một giao diện. Nó được sử dụng để thực thi mã sau khi khởi động ứng dụng Spring Boot. Ví dụ dưới đây cho thấy cách triển khai giao diện Command Line Runner trên tệp lớp chính.
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");
}
}
Nhìn vào cửa sổ bảng điều khiển bên dưới câu lệnh println “Hello world from Command Line Runner” được thực thi sau khi Tomcat khởi động.
Thuộc tính Ứng dụng hỗ trợ chúng ta làm việc trong các môi trường khác nhau. Trong chương này, bạn sẽ học cách cấu hình và chỉ định các thuộc tính cho ứng dụng Spring Boot.
Thuộc tính dòng lệnh
Ứng dụng Spring Boot chuyển đổi các thuộc tính dòng lệnh thành các thuộc tính Spring Boot Environment. Thuộc tính dòng lệnh được ưu tiên hơn các nguồn thuộc tính khác. Theo mặc định, Spring Boot sử dụng số cổng 8080 để khởi động Tomcat. Hãy để chúng tôi tìm hiểu cách thay đổi số cổng bằng cách sử dụng thuộc tính dòng lệnh.
Step 1 - Sau khi tạo một tệp JAR thực thi, hãy chạy nó bằng cách sử dụng lệnh java –jar <JARFILE>.
Step 2 - Sử dụng lệnh được cung cấp trong ảnh chụp màn hình dưới đây để thay đổi số cổng cho ứng dụng Spring Boot bằng cách sử dụng thuộc tính dòng lệnh.
Note - Bạn có thể cung cấp nhiều thuộc tính ứng dụng bằng cách sử dụng dấu phân cách -.
Tệp thuộc tính
Tệp thuộc tính được sử dụng để giữ số thuộc tính 'N' trong một tệp duy nhất để chạy ứng dụng trong một môi trường khác. Trong Spring Boot, các thuộc tính được giữ trongapplication.properties tệp dưới đường dẫn classpath.
Tệp application.properties nằm trong src/main/resourcesdanh mục. Mã cho mẫuapplication.properties tệp được cung cấp bên dưới -
server.port = 9090
spring.application.name = demoservice
Lưu ý rằng trong đoạn mã được hiển thị ở trên, bản trình diễn ứng dụng Spring Boot bắt đầu trên cổng 9090.
Tệp YAML
Spring Boot hỗ trợ các cấu hình thuộc tính dựa trên YAML để chạy ứng dụng. Thay vìapplication.properties, chúng ta có thể sử dụng application.ymltập tin. Tệp YAML này cũng nên được giữ bên trong classpath. Mẫuapplication.yml tệp được cung cấp bên dưới -
spring:
application:
name: demoservice
server:
port: 9090
Thuộc tính bên ngoài
Thay vì giữ tệp thuộc tính trong classpath, chúng ta có thể giữ các thuộc tính ở vị trí hoặc đường dẫn khác. Trong khi chạy tệp JAR, chúng ta có thể chỉ định đường dẫn tệp thuộc tính. Bạn có thể sử dụng lệnh sau để chỉ định vị trí của tệp thuộc tính trong khi chạy JAR:
-Dspring.config.location = C:\application.properties
Sử dụng chú thích @Value
Chú thích @Value được sử dụng để đọc giá trị thuộc tính môi trường hoặc ứng dụng trong mã Java. Cú pháp để đọc giá trị thuộc tính được hiển thị bên dưới:
@Value("${property_key_name}")
Hãy xem ví dụ sau cho thấy cú pháp để đọc spring.application.name giá trị thuộc tính trong biến Java bằng cách sử dụng chú thích @Value.
@Value("${spring.application.name}")
Hãy quan sát đoạn mã dưới đây để hiểu rõ hơn -
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class DemoApplication {
@Value("${spring.application.name}")
private String name;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@RequestMapping(value = "/")
public String name() {
return name;
}
}
Note - Nếu thuộc tính không được tìm thấy trong khi chạy ứng dụng, Spring Boot sẽ ném ngoại lệ Đối số bất hợp pháp dưới dạng Could not resolve placeholder 'spring.application.name' in value "${spring.application.name}".
Để giải quyết vấn đề trình giữ chỗ, chúng tôi có thể đặt giá trị mặc định cho thuộc tính bằng cách sử dụng cú pháp thr được cung cấp bên dưới:
@Value("${property_key_name:default_value}")
@Value("${spring.application.name:demoservice}")
Cấu hình hoạt động Spring Boot
Spring Boot hỗ trợ các thuộc tính khác nhau dựa trên cấu hình hoạt động của Spring. Ví dụ: chúng ta có thể giữ hai tệp riêng biệt để phát triển và sản xuất để chạy ứng dụng Spring Boot.
Hồ sơ hoạt động mùa xuân trong application.properties
Hãy để chúng tôi hiểu cách có hồ sơ hoạt động Spring trong application.properties. Theo mặc định, ứng dụng. thuộc tính sẽ được sử dụng để chạy ứng dụng Spring Boot. Nếu bạn muốn sử dụng các thuộc tính dựa trên hồ sơ, chúng tôi có thể giữ tệp thuộc tính riêng biệt cho từng hồ sơ như hình dưới đây -
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
Trong khi chạy tệp JAR, chúng ta cần chỉ định cấu hình hoạt động mùa xuân dựa trên mỗi tệp thuộc tính. Theo mặc định, ứng dụng Spring Boot sử dụng tệp application.properties. Lệnh thiết lập cấu hình hoạt động của lò xo được hiển thị bên dưới:
Bạn có thể thấy tên hồ sơ hoạt động trên nhật ký bảng điều khiển như hình dưới đây -
2017-11-26 08:13:16.322 INFO 14028 --- [
main] com.tutorialspoint.demo.DemoApplication :
The following profiles are active: dev
Bây giờ, Tomcat đã bắt đầu trên cổng 9090 (http) như hình dưới đây -
2017-11-26 08:13:20.185 INFO 14028 --- [
main] s.b.c.e.t.TomcatEmbeddedServletContainer :
Tomcat started on port(s): 9090 (http)
Bạn có thể đặt cấu hình hoạt động Sản xuất như hình dưới đây -
Bạn có thể thấy tên hồ sơ hoạt động trên nhật ký bảng điều khiển như hình dưới đây -
2017-11-26 08:13:16.322 INFO 14028 --- [
main] com.tutorialspoint.demo.DemoApplication :
The following profiles are active: prod
Bây giờ, Tomcat đã bắt đầu trên cổng 4431 (http) như hình dưới đây -
2017-11-26 08:13:20.185 INFO 14028 --- [
main] s.b.c.e.t.TomcatEmbeddedServletContainer :
Tomcat started on port(s): 4431 (http)
Hồ sơ hoạt động mùa xuân cho application.yml
Hãy để chúng tôi hiểu cách giữ cho hồ sơ Spring hoạt động cho application.yml. Chúng tôi có thể giữ các thuộc tính hồ sơ hoạt động Spring trong đơnapplication.ymltập tin. Không cần sử dụng tệp riêng biệt như application.properties.
Sau đây là mã ví dụ để giữ các cấu hình Spring hoạt động trong tệp application.yml. Lưu ý rằng dấu phân tách (---) được sử dụng để tách từng hồ sơ trong tệp 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
Lệnh để thiết lập cấu hình hoạt động phát triển được đưa ra dưới đây:
Bạn có thể thấy tên hồ sơ hoạt động trên nhật ký bảng điều khiển như hình dưới đây -
2017-11-26 08:41:37.202 INFO 14104 --- [
main] com.tutorialspoint.demo.DemoApplication :
The following profiles are active: dev
Bây giờ, Tomcat đã bắt đầu trên cổng 9090 (http) như hình dưới đây -
2017-11-26 08:41:46.650 INFO 14104 --- [
main] s.b.c.e.t.TomcatEmbeddedServletContainer :
Tomcat started on port(s): 9090 (http)
Lệnh đặt cấu hình hoạt động Sản xuất được đưa ra dưới đây:
Bạn có thể thấy tên hồ sơ hoạt động trên nhật ký bảng điều khiển như hình dưới đây -
2017-11-26 08:43:10.743 INFO 13400 --- [
main] com.tutorialspoint.demo.DemoApplication :
The following profiles are active: prod
Thao tác này sẽ khởi động Tomcat trên cổng 4431 (http) như hình dưới đây:
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 sử dụng ghi nhật ký Apache Commons cho tất cả ghi nhật ký nội bộ. Các cấu hình mặc định của Spring Boot cung cấp hỗ trợ cho việc sử dụng Java Util Logging, Log4j2 và Logback. Sử dụng chúng, chúng ta có thể định cấu hình ghi nhật ký bảng điều khiển cũng như ghi nhật ký tệp.
Nếu bạn đang sử dụng Spring Boot Starters, Logback sẽ hỗ trợ tốt cho việc ghi nhật ký. Bên cạnh đó, Logback cũng cung cấp khả năng hỗ trợ tốt cho Common Logging, Util Logging, Log4J và SLF4J.
Định dạng nhật ký
Định dạng Spring Boot Log mặc định được hiển thị trong ảnh chụp màn hình bên dưới.
cung cấp cho bạn thông tin sau:
Date và Time cung cấp ngày và giờ của nhật ký
Log level hiển thị THÔNG TIN, LỖI hoặc CẢNH BÁO
Process ID
--- là một dấu phân cách
Thread name được đặt trong dấu ngoặc vuông []
Logger Name hiển thị tên lớp Nguồn
Thông báo nhật ký
Đầu ra nhật ký bảng điều khiển
Thông báo nhật ký mặc định sẽ in ra cửa sổ bảng điều khiển. Theo mặc định, thông báo nhật ký “THÔNG TIN”, “LỖI” và “CẢNH BÁO” sẽ in trong tệp nhật ký.
Nếu bạn phải bật nhật ký mức gỡ lỗi, hãy thêm cờ gỡ lỗi khi khởi động ứng dụng của bạn bằng lệnh hiển thị bên dưới:
java –jar demo.jar --debug
Bạn cũng có thể thêm chế độ gỡ lỗi vào tệp application.properties của mình như được hiển thị ở đây -
debug = true
Đầu ra nhật ký tệp
Theo mặc định, tất cả nhật ký sẽ in trên cửa sổ bảng điều khiển chứ không phải trong tệp. Nếu bạn muốn in nhật ký trong một tệp, bạn cần đặt thuộc tínhlogging.file hoặc là logging.path trong tệp application.properties.
Bạn có thể chỉ định đường dẫn tệp nhật ký bằng thuộc tính được hiển thị bên dưới. Lưu ý rằng tên tệp nhật ký là spring.log.
logging.path = /var/tmp/
Bạn có thể chỉ định tên tệp nhật ký của riêng mình bằng cách sử dụng thuộc tính được hiển thị bên dưới -
logging.file = /var/tmp/mylog.log
Note - Các tệp sẽ tự động xoay sau khi đạt đến kích thước 10 MB.
Mức độ nhật ký
Spring Boot hỗ trợ tất cả các cấp độ ghi nhật ký như “TRACE”, “DEBUG”, “INFO”, “WARN”, “ERROR”, “FATAL”, “OFF”. Bạn có thể xác định trình ghi gốc trong tệp application.properties như hình dưới đây:
logging.level.root = WARN
Note- Logback không hỗ trợ nhật ký mức “FATAL”. Nó được ánh xạ tới nhật ký cấp “LỖI”.
Định cấu hình Logback
Logback hỗ trợ cấu hình dựa trên XML để xử lý các cấu hình Spring Boot Log. Chi tiết cấu hình ghi nhật ký được định cấu hình tronglogback.xmltập tin. Tệp logback.xml phải được đặt trong classpath.
Bạn có thể định cấu hình nhật ký cấp ROOT trong tệp Logback.xml bằng cách sử dụng mã được cung cấp bên dưới -
<?xml version = "1.0" encoding = "UTF-8"?>
<configuration>
<root level = "INFO">
</root>
</configuration>
Bạn có thể định cấu hình trình ứng dụng bảng điều khiển trong tệp Logback.xml được cung cấp bên dưới.
<?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>
Bạn có thể định cấu hình trình đính kèm tệp trong tệp Logback.xml bằng cách sử dụng mã được cung cấp bên dưới. Lưu ý rằng bạn cần chỉ định đường dẫn tệp nhật ký bên trong tệp đính kèm.
<?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>
Bạn có thể xác định mẫu Đăng nhập trong logback.xmlsử dụng mã được cung cấp bên dưới. Bạn cũng có thể xác định tập hợp các mẫu nhật ký được hỗ trợ bên trong bảng điều khiển hoặc trình duyệt nhật ký tệp bằng cách sử dụng mã được cung cấp bên dưới:
<pattern>[%d{yyyy-MM-dd'T'HH:mm:ss.sss'Z'}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
Mã cho tệp logback.xml hoàn chỉnh được cung cấp bên dưới. Bạn phải đặt cái này trong đường dẫn lớp.
<?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>
Đoạn mã dưới đây cho thấy cách thêm trình ghi nhật ký slf4j trong tệp lớp chính của 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);
}
}
Kết quả mà bạn có thể thấy trong cửa sổ bảng điều khiển được hiển thị ở đây -
Kết quả mà bạn có thể thấy trong tệp nhật ký được hiển thị ở đây -
Spring Boot hỗ trợ rất tốt cho việc xây dựng RESTful Web Services cho các ứng dụng doanh nghiệp. Chương này sẽ giải thích chi tiết về cách xây dựng các dịch vụ web RESTful bằng Spring Boot.
Note - Để xây dựng RESTful Web Services, chúng ta cần thêm phần phụ thuộc Spring Boot Starter Web vào tệp cấu hình xây dựng.
Nếu bạn là người dùng Maven, hãy sử dụng mã sau để thêm phần phụ thuộc bên dưới vào pom.xml tập tin -
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Nếu bạn là người dùng Gradle, hãy sử dụng mã sau để thêm phần phụ thuộc bên dưới vào build.gradle tập tin.
compile('org.springframework.boot:spring-boot-starter-web')
Mã cho tệp cấu hình bản dựng hoàn chỉnh Maven build – pom.xml được đưa ra dưới đây -
<?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>
Mã cho tệp cấu hình bản dựng hoàn chỉnh Gradle Build – build.gradle được đưa ra dưới đây -
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')
}
Trước khi bạn tiến hành xây dựng một dịch vụ web RESTful, bạn nên có kiến thức về các chú thích sau:
Bộ điều khiển phần còn lại
Chú thích @RestController được sử dụng để xác định các dịch vụ web RESTful. Nó phục vụ JSON, XML và phản hồi tùy chỉnh. Cú pháp của nó được hiển thị bên dưới:
@RestController
public class ProductServiceController {
}
Yêu cầu ánh xạ
Chú thích @RequestMapping được sử dụng để xác định URI yêu cầu để truy cập Điểm cuối REST. Chúng ta có thể định nghĩa phương thức Request để tiêu thụ và sản xuất đối tượng. Phương thức yêu cầu mặc định là GET.
@RequestMapping(value = "/products")
public ResponseEntity<Object> getProducts() { }
Nội dung yêu cầu
Chú thích @RequestBody được sử dụng để xác định loại nội dung thân yêu cầu.
public ResponseEntity<Object> createProduct(@RequestBody Product product) {
}
Biến đường dẫn
Chú thích @PathVariable được sử dụng để xác định URI yêu cầu động hoặc tùy chỉnh. Biến Path trong URI yêu cầu được định nghĩa là dấu ngoặc nhọn {} như được hiển thị bên dưới:
public ResponseEntity<Object> updateProduct(@PathVariable("id") String id) {
}
Yêu cầu tham số
Chú thích @RequestParam được sử dụng để đọc các tham số yêu cầu từ URL yêu cầu. Theo mặc định, nó là một tham số bắt buộc. Chúng tôi cũng có thể đặt giá trị mặc định cho các thông số yêu cầu như được hiển thị ở đây -
public ResponseEntity<Object> getProduct(
@RequestParam(value = "name", required = false, defaultValue = "honey") String name) {
}
GET API
Phương thức yêu cầu HTTP mặc định là GET. Phương pháp này không yêu cầu bất kỳ Cơ quan Yêu cầu nào. Bạn có thể gửi tham số yêu cầu và biến đường dẫn để xác định URL tùy chỉnh hoặc URL động.
Mã mẫu để xác định phương thức yêu cầu HTTP GET được hiển thị bên dưới. Trong ví dụ này, chúng tôi đã sử dụng HashMap để lưu trữ Sản phẩm. Lưu ý rằng chúng tôi đã sử dụng lớp POJO làm sản phẩm được lưu trữ.
Đây, URI yêu cầu là /productsvà nó sẽ trả về danh sách các sản phẩm từ kho lưu trữ HashMap. Tệp lớp bộ điều khiển được cung cấp bên dưới có chứa Điểm cuối REST của phương thức GET.
package com.tutorialspoint.demo.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.tutorialspoint.demo.model.Product;
@RestController
public class ProductServiceController {
private static Map<String, Product> productRepo = new HashMap<>();
static {
Product honey = new Product();
honey.setId("1");
honey.setName("Honey");
productRepo.put(honey.getId(), honey);
Product almond = new Product();
almond.setId("2");
almond.setName("Almond");
productRepo.put(almond.getId(), almond);
}
@RequestMapping(value = "/products")
public ResponseEntity<Object> getProduct() {
return new ResponseEntity<>(productRepo.values(), HttpStatus.OK);
}
}
API ĐĂNG
Yêu cầu HTTP POST được sử dụng để tạo tài nguyên. Phương thức này chứa phần thân yêu cầu. Chúng tôi có thể gửi tham số yêu cầu và biến đường dẫn để xác định URL tùy chỉnh hoặc URL động.
Ví dụ sau đây cho thấy mã mẫu để xác định phương thức yêu cầu HTTP POST. Trong ví dụ này, chúng tôi đã sử dụng HashMap để lưu trữ Sản phẩm, trong đó sản phẩm là một lớp POJO.
Đây, URI yêu cầu là /products, và nó sẽ trả về Chuỗi sau khi lưu trữ sản phẩm vào kho lưu trữ 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);
}
}
API PUT
Yêu cầu HTTP PUT được sử dụng để cập nhật tài nguyên hiện có. Phương thức này chứa một phần thân yêu cầu. Chúng tôi có thể gửi tham số yêu cầu và biến đường dẫn để xác định URL tùy chỉnh hoặc URL động.
Ví dụ dưới đây cho thấy cách xác định phương thức yêu cầu HTTP PUT. Trong ví dụ này, chúng tôi đã sử dụng HashMap để cập nhật Sản phẩm hiện có, trong đó sản phẩm là một lớp POJO.
Đây là URI yêu cầu /products/{id}sẽ trả về Chuỗi sau sản phẩm vào kho lưu trữ HashMap. Lưu ý rằng chúng tôi đã sử dụng biến Path{id} xác định ID sản phẩm cần được cập nhật.
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);
}
}
XÓA API
Yêu cầu Xóa HTTP được sử dụng để xóa tài nguyên hiện có. Phương thức này không chứa bất kỳ Nội dung Yêu cầu nào. Chúng tôi có thể gửi tham số yêu cầu và biến đường dẫn để xác định URL tùy chỉnh hoặc URL động.
Ví dụ dưới đây cho thấy cách xác định phương thức yêu cầu HTTP DELETE. Trong ví dụ này, chúng tôi đã sử dụng HashMap để xóa sản phẩm hiện có, là một lớp POJO.
URI yêu cầu là /products/{id}và nó sẽ trả về Chuỗi sau khi xóa sản phẩm khỏi kho lưu trữ HashMap. Chúng tôi đã sử dụng biến Path{id} xác định ID sản phẩm cần được xóa.
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);
}
}
Phần này cung cấp cho bạn bộ mã nguồn hoàn chỉnh. Quan sát các mã sau để biết các chức năng tương ứng của chúng:
The Spring Boot main application class – DemoApplication.java
package com.tutorialspoint.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
The POJO class – Product.java
package com.tutorialspoint.demo.model;
public class Product {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
The Rest Controller class – ProductServiceController.java
package com.tutorialspoint.demo.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.tutorialspoint.demo.model.Product;
@RestController
public class ProductServiceController {
private static Map<String, Product> productRepo = new HashMap<>();
static {
Product honey = new Product();
honey.setId("1");
honey.setName("Honey");
productRepo.put(honey.getId(), honey);
Product almond = new Product();
almond.setId("2");
almond.setName("Almond");
productRepo.put(almond.getId(), almond);
}
@RequestMapping(value = "/products/{id}", method = RequestMethod.DELETE)
public ResponseEntity<Object> delete(@PathVariable("id") String id) {
productRepo.remove(id);
return new ResponseEntity<>("Product is deleted successsfully", HttpStatus.OK);
}
@RequestMapping(value = "/products/{id}", method = RequestMethod.PUT)
public ResponseEntity<Object> updateProduct(@PathVariable("id") String id, @RequestBody Product product) {
productRepo.remove(id);
product.setId(id);
productRepo.put(id, product);
return new ResponseEntity<>("Product is updated successsfully", HttpStatus.OK);
}
@RequestMapping(value = "/products", method = RequestMethod.POST)
public ResponseEntity<Object> createProduct(@RequestBody Product product) {
productRepo.put(product.getId(), product);
return new ResponseEntity<>("Product is created successfully", HttpStatus.CREATED);
}
@RequestMapping(value = "/products")
public ResponseEntity<Object> getProduct() {
return new ResponseEntity<>(productRepo.values(), HttpStatus.OK);
}
}
Bạn có thể tạo tệp JAR có thể thực thi và chạy ứng dụng khởi động mùa xuân bằng cách sử dụng lệnh Maven hoặc Gradle bên dưới như được hiển thị:
Đối với Maven, sử dụng lệnh hiển thị bên dưới:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, sử dụng lệnh hiển thị bên dưới:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bạn có thể chạy tệp JAR bằng cách sử dụng lệnh hiển thị bên dưới:
java –jar <JARFILE>
Thao tác này sẽ khởi động ứng dụng trên cổng Tomcat 8080 như hình dưới đây -
Bây giờ hãy nhấn vào URL được hiển thị bên dưới trong ứng dụng POSTMAN và xem kết quả.
URL GET API là: http://localhost:8080/products
URL POST API là: http://localhost:8080/products
URL của PUT API là: http://localhost:8080/products/3
URL của API DELETE là: http://localhost:8080/products/3
Xử lý các ngoại lệ và lỗi trong API và gửi phản hồi thích hợp đến máy khách là điều tốt cho các ứng dụng doanh nghiệp. Trong chương này, chúng ta sẽ học cách xử lý các ngoại lệ trong Spring Boot.
Trước khi tiếp tục xử lý ngoại lệ, hãy để chúng tôi hiểu về các chú thích sau.
Lời khuyên của người điều khiển
@ControllerAdvice là một chú thích, để xử lý các ngoại lệ trên toàn cầu.
Xử lý ngoại lệ
@ExceptionHandler là một chú thích được sử dụng để xử lý các ngoại lệ cụ thể và gửi các phản hồi tùy chỉnh cho máy khách.
Bạn có thể sử dụng mã sau để tạo lớp @ControllerAdvice để xử lý các ngoại lệ trên toàn cầu -
package com.tutorialspoint.demo.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
@ControllerAdvice
public class ProductExceptionController {
}
Định nghĩa một lớp mở rộng lớp RuntimeException.
package com.tutorialspoint.demo.exception;
public class ProductNotfoundException extends RuntimeException {
private static final long serialVersionUID = 1L;
}
Bạn có thể xác định phương thức @ExceptionHandler để xử lý các ngoại lệ như được hiển thị. Phương thức này nên được sử dụng để ghi tệp lớp Tư vấn bộ điều khiển.
@ExceptionHandler(value = ProductNotfoundException.class)
public ResponseEntity<Object> exception(ProductNotfoundException exception) {
}
Bây giờ, hãy sử dụng đoạn mã dưới đây để loại bỏ ngoại lệ khỏi API.
@RequestMapping(value = "/products/{id}", method = RequestMethod.PUT)
public ResponseEntity<Object> updateProduct() {
throw new ProductNotfoundException();
}
Mã hoàn chỉnh để xử lý ngoại lệ được đưa ra dưới đây. Trong ví dụ này, chúng tôi đã sử dụng API PUT để cập nhật sản phẩm. Tại đây, trong khi cập nhật sản phẩm, nếu sản phẩm không được tìm thấy thì trả về thông báo lỗi phản hồi là “Không tìm thấy sản phẩm”. Lưu ý rằngProductNotFoundException lớp ngoại lệ nên mở rộng RuntimeException.
package com.tutorialspoint.demo.exception;
public class ProductNotfoundException extends RuntimeException {
private static final long serialVersionUID = 1L;
}
Lớp Tư vấn Bộ điều khiển để xử lý ngoại lệ trên toàn cầu được đưa ra bên dưới. Chúng ta có thể xác định bất kỳ phương thức xử lý ngoại lệ nào trong tệp lớp này.
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);
}
}
Tệp trình điều khiển API Dịch vụ Sản phẩm được cung cấp bên dưới để cập nhật Sản phẩm. Nếu Sản phẩm không được tìm thấy, thì nó sẽ némProductNotFoundException lớp học.
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);
}
}
Mã cho tệp lớp ứng dụng Spring Boot chính được cung cấp bên dưới:
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);
}
}
Mã cho POJO class cho Sản phẩm được đưa ra bên dưới -
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;
}
}
Mã cho Maven build – pom.xml được hiển thị bên dưới -
<?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>
Mã cho Gradle Build – build.gradle được đưa ra dưới đây -
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')
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng lệnh Maven hoặc Gradle -
Đối với Maven, bạn có thể sử dụng lệnh sau:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, bạn có thể sử dụng lệnh sau:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bạn có thể chạy tệp JAR bằng cách sử dụng lệnh sau:
java –jar <JARFILE>
Thao tác này sẽ khởi động ứng dụng trên cổng Tomcat 8080 như hình dưới đây -
Bây giờ, hãy nhấn vào URL bên dưới trong ứng dụng POSTMAN và bạn có thể thấy kết quả như hình dưới đây -
Cập nhật URL: http: // localhost: 8080 / products / 3
Bạn có thể sử dụng Interceptor trong Spring Boot để thực hiện các hoạt động trong các trường hợp sau:
Trước khi gửi yêu cầu đến bộ điều khiển
Trước khi gửi phản hồi cho khách hàng
Ví dụ: bạn có thể sử dụng bộ đánh chặn để thêm tiêu đề yêu cầu trước khi gửi yêu cầu đến bộ điều khiển và thêm tiêu đề phản hồi trước khi gửi phản hồi đến máy khách.
Để làm việc với interceptor, bạn cần tạo @Component lớp hỗ trợ nó và nó sẽ triển khai HandlerInterceptor giao diện.
Sau đây là ba phương pháp bạn nên biết khi làm việc trên Interceptors -
preHandle()- Phương thức này được sử dụng để thực hiện các hoạt động trước khi gửi yêu cầu đến bộ điều khiển. Phương thức này phải trả về true để trả về phản hồi cho máy khách.
postHandle() - Phương thức này được sử dụng để thực hiện các hoạt động trước khi gửi phản hồi đến máy khách.
afterCompletion() - Phương thức này được sử dụng để thực hiện các thao tác sau khi hoàn thành yêu cầu và phản hồi.
Hãy quan sát đoạn mã sau để hiểu rõ hơn:
@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 {}
}
Bạn sẽ phải đăng ký Interceptor này với InterceptorRegistry bằng cách sử dụng WebMvcConfigurerAdapter như hình dưới đây -
@Component
public class ProductServiceInterceptorAppConfig extends WebMvcConfigurerAdapter {
@Autowired
ProductServiceInterceptor productServiceInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(productServiceInterceptor);
}
}
Trong ví dụ được đưa ra bên dưới, chúng ta sẽ truy cập vào API sản phẩm GET cung cấp kết quả đầu ra như được cho trong:
Mã cho lớp Interceptor ProductServiceInterceptor.java được cung cấp bên dưới:
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");
}
}
Mã cho tệp lớp cấu hình ứng dụng để đăng ký Interceptor vào Interceptor Registry - ProductServiceInterceptorAppConfig.java được cung cấp bên dưới -
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);
}
}
Mã cho tệp lớp Bộ điều khiển ProductServiceController.java được cung cấp bên dưới:
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);
}
}
Mã cho lớp POJO cho Product.java được cung cấp bên dưới:
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;
}
}
Mã cho tệp lớp ứng dụng Spring Boot chính DemoApplication.java được đưa ra dưới đây -
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);
}
}
Mã cho bản dựng Maven - pom.xml được hiển thị ở đây -
<?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>
Mã cho Gradle Build build.gradle được hiển thị ở đây -
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')
}
Bạn có thể tạo tệp JAR có thể thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng lệnh Maven hoặc Gradle bên dưới.
Đối với Maven, sử dụng lệnh như hình dưới đây:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, sử dụng lệnh như hình dưới đây:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bạn có thể chạy tệp JAR bằng cách sử dụng lệnh sau:
java –jar <JARFILE>
Bây giờ, ứng dụng đã khởi động trên cổng Tomcat 8080 như hình dưới đây -
Bây giờ hãy nhấn vào URL bên dưới trong ứng dụng POSTMAN và bạn có thể thấy kết quả như được hiển thị bên dưới -
TẢI API: http://localhost:8080/products
Trong cửa sổ bảng điều khiển, bạn có thể thấy các câu lệnh System.out.println được thêm vào Interceptor như được hiển thị trong ảnh chụp màn hình bên dưới:
Bộ lọc là một đối tượng được sử dụng để chặn các yêu cầu HTTP và phản hồi của ứng dụng của bạn. Bằng cách sử dụng bộ lọc, chúng tôi có thể thực hiện hai hoạt động tại hai trường hợp:
- Trước khi gửi yêu cầu đến bộ điều khiển
- Trước khi gửi phản hồi cho khách hàng.
Đoạn mã sau hiển thị mã mẫu cho lớp triển khai Bộ lọc Servlet với chú thích @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 {}
}
Ví dụ sau cho thấy mã để đọc máy chủ từ xa và địa chỉ từ xa từ đối tượng ServletRequest trước khi gửi yêu cầu đến bộ điều khiển.
Trong phương thức doFilter (), chúng tôi đã thêm các câu lệnh System.out.println để in máy chủ từ xa và địa chỉ từ xa.
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 {}
}
Trong tệp lớp ứng dụng chính của Spring Boot, chúng tôi đã thêm điểm cuối REST đơn giản trả về chuỗi “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";
}
}
Mã cho bản dựng Maven - pom.xml được đưa ra dưới đây -
<?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>
Mã cho Gradle Build - build.gradle được cung cấp bên dưới:
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')
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng lệnh Maven hoặc Gradle được hiển thị bên dưới:
Đối với Maven, sử dụng lệnh như hình dưới đây:
mvn clean install
Sau khi XÂY DỰNG THÀNH CÔNG, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, sử dụng lệnh như hình dưới đây:
gradle clean build
Sau khi XÂY DỰNG THÀNH CÔNG, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, hãy chạy tệp JAR bằng cách sử dụng lệnh sau
java –jar <JARFILE>
Bạn có thể thấy ứng dụng đã khởi động trên cổng Tomcat 8080.
Bây giờ hãy nhấn vào URL http://localhost:8080/và xem đầu ra Hello World. Nó sẽ trông như hình dưới đây -
Sau đó, bạn có thể thấy địa chỉ Máy chủ từ xa và Địa chỉ từ xa trên nhật ký bảng điều khiển như hình dưới đây -
Spring Boot cho phép bạn chạy cùng một ứng dụng nhiều lần trên một số cổng khác nhau. Trong chương này, bạn sẽ tìm hiểu về điều này một cách chi tiết. Lưu ý rằng số cổng mặc định 8080.
Cổng tùy chỉnh
bên trong application.properties tệp, chúng tôi có thể đặt số cổng tùy chỉnh cho thuộc tính server.port
server.port = 9090
bên trong application.yml , bạn có thể tìm thấy như sau:
server:
port: 9090
Cổng ngẫu nhiên
bên trong application.properties tệp, chúng tôi có thể đặt số cổng ngẫu nhiên cho thuộc tính server.port
server.port = 0
bên trong application.yml , bạn có thể tìm thấy như sau:
server:
port: 0
Note - Nếu server.port số là 0 trong khi khởi động ứng dụng Spring Boot, Tomcat sử dụng số cổng ngẫu nhiên.
Rest Template được sử dụng để tạo các ứng dụng sử dụng RESTful Web Services. Bạn có thể dùngexchange()để sử dụng các dịch vụ web cho tất cả các phương thức HTTP. Đoạn mã dưới đây cho thấy cách tạo Bean for Rest Template để tự động nối dây đối tượng 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();
}
}
ĐƯỢC
Consuming the GET API by using RestTemplate - exchange() method
Giả sử URL này http://localhost:8080/products trả về JSON sau và chúng tôi sẽ sử dụng phản hồi API này bằng cách sử dụng Mẫu phần còn lại sử dụng mã sau:
[
{
"id": "1",
"name": "Honey"
},
{
"id": "2",
"name": "Almond"
}
]
Bạn sẽ phải tuân theo các điểm đã cho để sử dụng API -
- Tự động tải đối tượng mẫu còn lại.
- Sử dụng HttpHeaders để đặt Tiêu đề yêu cầu.
- Sử dụng HttpEntity để bọc đối tượng yêu cầu.
- Cung cấp URL, HttpMethod và kiểu trả về cho phương thức 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();
}
}
BÀI ĐĂNG
Consuming POST API by using RestTemplate - exchange() method
Giả sử URL này http://localhost:8080/products trả về phản hồi được hiển thị bên dưới, chúng tôi sẽ sử dụng phản hồi API này bằng cách sử dụng Mẫu phần còn lại.
Đoạn mã được cung cấp bên dưới là nội dung Yêu cầu -
{
"id":"3",
"name":"Ginger"
}
Đoạn mã được đưa ra bên dưới là phần Nội dung phản hồi -
Product is created successfully
Bạn sẽ phải làm theo các điểm được đưa ra bên dưới để sử dụng API -
Tự động tải đối tượng mẫu còn lại.
Sử dụng HttpHeaders để đặt Tiêu đề yêu cầu.
Sử dụng HttpEntity để bọc đối tượng yêu cầu. Ở đây, chúng tôi bọc đối tượng Sản phẩm để gửi nó đến nội dung yêu cầu.
Cung cấp URL, HttpMethod và Loại trả lại cho phương thức 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();
}
}
ĐẶT
Consuming PUT API by using RestTemplate - exchange() method
Giả sử URL này http://localhost:8080/products/3 trả về phản hồi bên dưới và chúng tôi sẽ sử dụng phản hồi API này bằng cách sử dụng Mẫu phần còn lại.
Đoạn mã đưa ra bên dưới là Nội dung yêu cầu -
{
"name":"Indian Ginger"
}
Đoạn mã được đưa ra bên dưới là phần Nội dung phản hồi -
Product is updated successfully
Bạn sẽ phải làm theo các điểm được đưa ra bên dưới để sử dụng API -
Tự động tải đối tượng mẫu còn lại.
Sử dụng HttpHeaders để đặt Tiêu đề yêu cầu.
Sử dụng HttpEntity để bọc đối tượng yêu cầu. Ở đây, chúng tôi bọc đối tượng Sản phẩm để gửi nó đến nội dung yêu cầu.
Cung cấp URL, HttpMethod và Loại trả lại cho phương thức 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();
}
}
XÓA BỎ
Consuming DELETE API by using RestTemplate - exchange() method
Giả sử URL này http://localhost:8080/products/3 trả về phản hồi được cung cấp bên dưới và chúng tôi sẽ sử dụng phản hồi API này bằng cách sử dụng Mẫu phần còn lại.
Dòng mã này được hiển thị bên dưới là phần Nội dung phản hồi -
Product is deleted successfully
Bạn sẽ phải làm theo các điểm được hiển thị bên dưới để sử dụng API -
Tự động tải đối tượng mẫu còn lại.
Sử dụng HttpHeaders để đặt Tiêu đề yêu cầu.
Sử dụng HttpEntity để bọc đối tượng yêu cầu.
Cung cấp URL, HttpMethod và Loại trả lại cho phương thức 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();
}
}
Tệp lớp Bộ điều khiển mẫu Rest hoàn chỉnh được cung cấp bên dưới:
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();
}
}
Mã cho Lớp ứng dụng khởi động mùa xuân - DemoApplication.java được cung cấp bên dưới:
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);
}
}
Mã cho bản dựng Maven - pom.xml được cung cấp bên dưới -
<?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>
Mã cho Gradle Build - build.gradle được cung cấp bên dưới:
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')
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng các lệnh Maven hoặc Gradle sau:
Đối với Maven, bạn có thể sử dụng lệnh dưới đây:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, bạn có thể sử dụng lệnh hiển thị bên dưới:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, hãy chạy tệp JAR bằng cách sử dụng lệnh sau:
java –jar <JARFILE>
Bây giờ, ứng dụng đã khởi động trên cổng Tomcat 8080.
Bây giờ, hãy nhấn vào URL bên dưới trong ứng dụng POSTMAN và bạn có thể thấy kết quả.
NHẬN Sản phẩm theo Mẫu còn lại - http://localhost:8080/template/products
Tạo sản phẩm ĐĂNG - http://localhost:8080/template/products
Cập nhật sản phẩm PUT - http://localhost:8080/template/products/3
Xóa sản phẩm - http://localhost:8080/template/products/3
Trong chương này, bạn sẽ học cách tải lên và tải xuống tệp bằng cách sử dụng dịch vụ web.
Tải lên tệp
Để tải lên một tệp, bạn có thể sử dụng MultipartFiledưới dạng Tham số yêu cầu và API này phải sử dụng giá trị dữ liệu biểu mẫu Nhiều phần. Quan sát đoạn mã dưới đây -
@RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public String fileUpload(@RequestParam("file") MultipartFile file) {
return null;
}
Mã hoàn chỉnh cho cùng một mã được cung cấp dưới đây -
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";
}
}
Tập tin tải về
Để tải xuống tệp, bạn nên sử dụng InputStreamResource để tải tệp xuống. Chúng ta cần đặt HttpHeaderContent-Disposition trong Phản hồi và cần chỉ định Loại phương tiện phản hồi của ứng dụng.
Note - Trong ví dụ sau, tệp phải có sẵn trên đường dẫn được chỉ định nơi ứng dụng đang chạy.
@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;
}
Mã hoàn chỉnh cho cùng một mã được cung cấp dưới đây -
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;
}
}
Ứng dụng Spring Boot chính được đưa ra bên dưới:
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);
}
}
Mã cho bản dựng Maven - pom.xml được cung cấp bên dưới -
<?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>
Mã cho Gradle Build - build.gradle được cung cấp bên dưới:
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')
}
Giờ đây, bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng lệnh Maven hoặc Gradle được cung cấp bên dưới:
Đối với Maven, hãy sử dụng lệnh dưới đây:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, bạn có thể sử dụng lệnh hiển thị bên dưới:
sgradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, hãy chạy tệp JAR bằng cách sử dụng lệnh sau:
java –jar <JARFILE>
Thao tác này sẽ khởi động ứng dụng trên cổng Tomcat 8080 như hình dưới đây -
Bây giờ hãy nhấn vào URL bên dưới trong ứng dụng POSTMAN và bạn có thể thấy kết quả như hình dưới đây -
Tải lên tệp - http://localhost:8080/upload
Tải xuống tệp - http://localhost:8080/upload
Thành phần dịch vụ là tệp lớp có chứa chú thích @Service. Các tệp lớp này được sử dụng để viết logic nghiệp vụ trong một lớp khác, tách biệt với tệp lớp @RestController. Logic để tạo tệp lớp thành phần dịch vụ được hiển thị ở đây:
public interface ProductService {
}
Lớp triển khai Giao diện với chú thích @Service như được hiển thị:
@Service
public class ProductServiceImpl implements ProductService {
}
Hãy quan sát rằng trong hướng dẫn này, chúng tôi đang sử dụng Product Service API(s)để lưu trữ, truy xuất, cập nhật và xóa các sản phẩm. Chúng tôi đã viết logic nghiệp vụ trong chính tệp lớp @RestController. Bây giờ, chúng ta sẽ chuyển mã logic nghiệp vụ từ bộ điều khiển sang thành phần dịch vụ.
Bạn có thể tạo một Giao diện chứa các phương thức thêm, sửa, lấy và xóa bằng cách sử dụng mã như hình dưới đây -
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();
}
Đoạn mã sau sẽ cho phép bạn tạo một lớp triển khai giao diện ProductService với chú thích @Service và viết logic nghiệp vụ để lưu trữ, truy xuất, xóa và cập nhật sản phẩm.
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();
}
}
Đoạn mã ở đây hiển thị tệp lớp Rest Controller, ở đây chúng tôi @Chúng tôi mong muốn giao diện ProductService và gọi các phương thức.
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);
}
}
Mã cho lớp POJO - Product.java được hiển thị ở đây -
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;
}
}
Dưới đây là một ứng dụng Spring Boot chính:
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);
}
}
Mã cho bản dựng Maven - pom.xml được hiển thị bên dưới -
<?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>
Mã cho Gradle Build - build.gradle được hiển thị bên dưới -
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')
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng lệnh Maven hoặc Gradle được cung cấp bên dưới:
Đối với Maven, sử dụng lệnh như hình dưới đây:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, bạn có thể sử dụng lệnh như hình dưới đây:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Chạy tệp JAR bằng cách sử dụng lệnh dưới đây:
java –jar <JARFILE>
Bây giờ, ứng dụng đã khởi động trên cổng Tomcat 8080 như thể hiện trong hình ảnh bên dưới -
Bây giờ hãy nhấn vào URL bên dưới trong ứng dụng POSTMAN và bạn có thể thấy kết quả như hình dưới đây -
URL GET API là - http://localhost:8080/products
URL POST API là - http://localhost:8080/products
URL của PUT API là - http://localhost:8080/products/3
URL của DELETE API là - http://localhost:8080/products/3
Thymeleaf là một thư viện dựa trên Java được sử dụng để tạo một ứng dụng web. Nó hỗ trợ tốt cho việc phân phát XHTML / HTML5 trong các ứng dụng web. Trong chương này, bạn sẽ tìm hiểu chi tiết về Thymeleaf.
Mẫu Thymeleaf
Thymeleaf chuyển đổi các tệp của bạn thành các tệp XML được định dạng tốt. Nó chứa 6 loại mẫu như được đưa ra bên dưới:
- XML
- XML hợp lệ
- XHTML
- XHTML hợp lệ
- HTML5
- HTML5 kế thừa
Tất cả các mẫu, ngoại trừ HTML5 cũ, đều đề cập đến các tệp XML hợp lệ được định dạng tốt. HTML5 cũ cho phép chúng tôi hiển thị các thẻ HTML5 trong trang web bao gồm cả các thẻ không đóng.
Ứng dụng web
Bạn có thể sử dụng các mẫu Thymeleaf để tạo ứng dụng web trong Spring Boot. Bạn sẽ phải làm theo các bước dưới đây để tạo một ứng dụng web trong Spring Boot bằng cách sử dụng Thymeleaf.
Sử dụng mã sau để tạo tệp lớp @Controller để chuyển hướng URI yêu cầu sang tệp 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";
}
}
Trong ví dụ trên, URI yêu cầu là /indexvà điều khiển được chuyển hướng đến tệp index.html. Lưu ý rằng tệp index.html nên được đặt trong thư mục mẫu và tất cả các tệp JS và CSS phải được đặt trong thư mục tĩnh trong classpath. Trong ví dụ được hiển thị, chúng tôi đã sử dụng tệp CSS để thay đổi màu của văn bản.
Bạn có thể sử dụng mã sau và tạo tệp CSS trong thư mục riêng biệt css và đặt tên tệp là styles.css -
h4 {
color: red;
}
Mã cho tệp index.html được cung cấp bên dưới -
<!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>
Trình khám phá dự án được hiển thị trong ảnh chụp màn hình dưới đây -
Bây giờ, chúng ta cần thêm phần phụ thuộc Spring Boot Starter Thymeleaf vào tệp cấu hình xây dựng của chúng ta.
Người dùng Maven có thể thêm phần phụ thuộc sau vào tệp pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Người dùng Gradle có thể thêm phần phụ thuộc sau vào tệp build.gradle -
compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf'
Mã cho tệp lớp ứng dụng Spring Boot chính được cung cấp bên dưới:
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);
}
}
Mã cho Maven - pom.xml được cung cấp bên dưới -
<?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>
Mã cho Gradle - build.gradle được cung cấp bên dưới -
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')
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng khởi động mùa xuân bằng cách sử dụng các lệnh Maven hoặc Gradle sau:
Đối với Maven, sử dụng lệnh như hình dưới đây:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, sử dụng lệnh như hình dưới đây:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Chạy tệp JAR bằng cách sử dụng lệnh ở đây -
java –jar <JARFILE>
Bây giờ, ứng dụng đã khởi động trên cổng Tomcat 8080 như hình dưới đây -
Bây giờ, hãy nhấn vào URL trong trình duyệt web của bạn và bạn có thể thấy đầu ra như được hiển thị -
http://localhost:8080/index
Chương này sẽ thảo luận chi tiết về việc sử dụng Dịch vụ Web RESTful bằng cách sử dụng jQuery AJAX.
Tạo một ứng dụng web Spring Boot đơn giản và viết một tệp lớp bộ điều khiển được sử dụng để chuyển hướng sang tệp HTML để sử dụng các dịch vụ web RESTful.
Chúng ta cần thêm Spring Boot Starter Thymeleaf và phụ thuộc Web vào tệp cấu hình xây dựng của chúng ta.
Đối với người dùng Maven, hãy thêm các phần phụ thuộc bên dưới vào tệp pom.xml của bạn.
<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>
Đối với người dùng Gradle, hãy thêm các phần phụ thuộc bên dưới vào tệp build.gradle của bạn -
compile group: ‘org.springframework.boot’, name: ‘spring-boot-starter-thymeleaf’
compile(‘org.springframework.boot:spring-boot-starter-web’)
Mã cho tệp lớp @Controller được cung cấp bên dưới:
@Controller
public class ViewController {
}
Bạn có thể xác định các phương thức URI yêu cầu để chuyển hướng vào tệp HTML như được hiển thị bên dưới:
@RequestMapping(“/view-products”)
public String viewProducts() {
return “view-products”;
}
@RequestMapping(“/add-products”)
public String addProducts() {
return “add-products”;
}
API này http://localhost:9090/products sẽ trả về JSON bên dưới để phản hồi như hình dưới đây -
[
{
"id": "1",
"name": "Honey"
},
{
"id": "2",
"name": "Almond"
}
]
Bây giờ, hãy tạo một tệp view-products.html trong thư mục mẫu trong classpath.
Trong tệp HTML, chúng tôi đã thêm thư viện jQuery và viết mã để sử dụng dịch vụ web RESTful khi tải trang.
<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>
Phương thức POST và URL này http://localhost:9090/products nên chứa Nội dung yêu cầu và Cơ quan phản hồi bên dưới.
Mã cho nội dung Yêu cầu được cung cấp bên dưới:
{
"id":"3",
"name":"Ginger"
}
Mã cho phần phản hồi được cung cấp bên dưới:
Product is created successfully
Bây giờ, tạo tệp add-products.html trong thư mục mẫu trong classpath.
Trong tệp HTML, chúng tôi đã thêm thư viện jQuery và viết mã gửi biểu mẫu tới dịch vụ web RESTful khi nhấp vào nút.
<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>
Mã hoàn chỉnh được đưa ra dưới đây.
Maven - tệp 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>
Mã cho Gradle - build.gradle được cung cấp bên dưới -
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’)
}
Tệp lớp bộ điều khiển được cung cấp bên dưới - ViewController.java được cung cấp bên dưới -
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”;
}
}
Tệp view-products.html được cung cấp bên dưới -
<!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>
Tệp add-products.html được cung cấp bên dưới -
<!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>
Tệp lớp Ứng dụng Spring Boot chính được cung cấp bên dưới:
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);
}
}
Bây giờ, bạn có thể tạo một tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng các lệnh Maven hoặc Gradle sau đây.
Đối với Maven, hãy sử dụng lệnh như dưới đây:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, sử dụng lệnh như dưới đây:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Chạy tệp JAR bằng cách sử dụng lệnh sau:
java –jar <JARFILE>
Bây giờ, ứng dụng đã khởi động trên cổng Tomcat 8080.
Bây giờ, hãy nhấn vào URL trong trình duyệt web của bạn và bạn có thể thấy đầu ra như được hiển thị -
http: // localhost: 8080 / view-products
http: // localhost: 8080 / add-products
Bây giờ, hãy nhấp vào nút Click here to submit the form và bạn có thể thấy kết quả như hình -
Bây giờ, hãy nhấp vào URL xem sản phẩm và xem sản phẩm đã tạo.
http://localhost:8080/view-products
Angular JS
Để sử dụng các API bằng cách sử dụng Angular JS, bạn có thể sử dụng các ví dụ dưới đây:
Sử dụng mã sau để tạo Bộ điều khiển JS Angular để sử dụng API GET - 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;
});
});
Sử dụng mã sau để tạo Bộ điều khiển JS Angular để sử dụng API POST - http://localhost:9090/products -
angular.module('demo', [])
.controller('Hello', function($scope, $http) {
$http.post('http://localhost:9090/products',data).
then(function(response) {
console.log("Product created successfully");
});
});
Note - Dữ liệu phương thức Post đại diện cho phần thân Request ở định dạng JSON để tạo sản phẩm.
Chia sẻ tài nguyên xuyên nguồn (CORS) là một khái niệm bảo mật cho phép hạn chế các tài nguyên được triển khai trong trình duyệt web. Nó ngăn mã JavaScript tạo ra hoặc sử dụng các yêu cầu đối với các nguồn gốc khác nhau.
Ví dụ: ứng dụng web của bạn đang chạy trên cổng 8080 và bằng cách sử dụng JavaScript, bạn đang cố gắng sử dụng các dịch vụ web RESTful từ cổng 9090. Trong những tình huống như vậy, bạn sẽ phải đối mặt với vấn đề bảo mật Chia sẻ tài nguyên xuyên nguồn trên trình duyệt web của mình.
Cần có hai yêu cầu để xử lý vấn đề này -
Các dịch vụ web RESTful phải hỗ trợ Chia sẻ tài nguyên đa nguồn.
Ứng dụng dịch vụ web RESTful sẽ cho phép truy cập (các) API từ cổng 8080.
Trong chương này, chúng ta sẽ tìm hiểu chi tiết về Cách kích hoạt yêu cầu đa nguồn cho ứng dụng RESTful Web Service.
Bật CORS trong Phương pháp Bộ điều khiển
Chúng ta cần đặt nguồn gốc cho dịch vụ web RESTful bằng cách sử dụng @CrossOriginchú thích cho phương thức bộ điều khiển. Chú thích @CrossOrigin này hỗ trợ API REST cụ thể chứ không phải cho toàn bộ ứng dụng.
@RequestMapping(value = "/products")
@CrossOrigin(origins = "http://localhost:8080")
public ResponseEntity<Object> getProduct() {
return null;
}
Cấu hình CORS toàn cầu
Chúng tôi cần xác định cấu hình @Bean được hiển thị để đặt hỗ trợ cấu hình CORS trên toàn cầu cho ứng dụng Spring Boot của bạn.
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/products").allowedOrigins("http://localhost:9000");
}
};
}
Mã để thiết lập cấu hình CORS toàn cầu trong ứng dụng Spring Boot chính được đưa ra dưới đây.
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");
}
};
}
}
Bây giờ, bạn có thể tạo ứng dụng web Spring Boot chạy trên cổng 8080 và ứng dụng dịch vụ web RESTful của bạn có thể chạy trên cổng 9090. Để biết thêm chi tiết về cách triển khai về Dịch vụ Web RESTful, bạn có thể tham khảo chương có tiêu đềConsuming RESTful Web Services của hướng dẫn này.
Quốc tế hóa là một quá trình làm cho ứng dụng của bạn có thể thích ứng với các ngôn ngữ và khu vực khác nhau mà không cần thay đổi kỹ thuật trên mã nguồn. Nói cách khác, Quốc tế hóa là sự sẵn sàng của Bản địa hóa.
Trong chương này, chúng ta sẽ tìm hiểu chi tiết về Cách triển khai Internationalization trong Spring Boot.
Sự phụ thuộc
Chúng ta cần sự phụ thuộc của Spring Boot Starter Web và Spring Boot Starter Thymeleaf để phát triển một ứng dụng web trong Spring Boot.
Maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Gradle
compile('org.springframework.boot:spring-boot-starter-web')
compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf'
LocaleResolver
Chúng tôi cần xác định Ngôn ngữ mặc định của ứng dụng của bạn. Chúng ta cần thêm bean LocaleResolver vào ứng dụng Spring Boot của mình.
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
sessionLocaleResolver.setDefaultLocale(Locale.US);
return sessionLocaleResolver;
}
LocaleChangeInterceptor
LocaleChangeInterceptor được sử dụng để thay đổi Ngôn ngữ mới dựa trên giá trị của tham số ngôn ngữ được thêm vào một yêu cầu.
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("language");
return localeChangeInterceptor;
}
Để có hiệu lực này, chúng ta cần thêm LocaleChangeInterceptor vào bộ chặn đăng ký của ứng dụng. Lớp cấu hình nên mở rộng lớp WebMvcConfigurerAdapter và ghi đè phương thức addInterceptors ().
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
Nguồn tin nhắn
Ứng dụng Spring Boot theo mặc định lấy các nguồn tin nhắn từ src/main/resourcestrong thư mục classpath. Tên tệp tin nhắn ngôn ngữ mặc định phải làmessage.properties và các tệp cho mỗi ngôn ngữ phải có tên là messages_XX.properties. "XX" đại diện cho mã ngôn ngữ.
Tất cả các thuộc tính thông báo nên được sử dụng làm giá trị cặp khóa. Nếu không tìm thấy bất kỳ thuộc tính nào trên ngôn ngữ, ứng dụng sẽ sử dụng thuộc tính mặc định từ tệp tin messages.properties.
Các message.properties mặc định sẽ được hiển thị như sau:
welcome.text=Hi Welcome to Everyone
Các message_fr.properties bằng tiếng Pháp sẽ được hiển thị như sau -
welcome.text=Salut Bienvenue à tous
Note - Tệp nguồn tin nhắn phải được lưu dưới dạng tệp “UTF-8”.
Tệp HTML
Trong tệp HTML, hãy sử dụng cú pháp #{key} để hiển thị các thông báo từ tệp thuộc tính.
<h1 th:text = "#{welcome.text}"></h1>
Mã hoàn chỉnh được cung cấp bên dưới
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')
}
Tệp lớp ứng dụng Spring Boot chính được cung cấp bên dưới:
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);
}
}
Tệp lớp bộ điều khiển được cung cấp bên dưới:
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";
}
}
Lớp cấu hình để hỗ trợ quốc tế hóa
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());
}
}
Nguồn tin nhắn - messages.properties như được minh họa -
welcome.text = Hi Welcome to Everyone
Nguồn tin nhắn - message_fr.properties như được hiển thị -
welcome.text = Salut Bienvenue à tous
Tệp HTML locale.html nên được đặt trong thư mục mẫu trên classpath như được hiển thị -
<!DOCTYPE html>
<html>
<head>
<meta charset = "ISO-8859-1"/>
<title>Internationalization</title>
</head>
<body>
<h1 th:text = "#{welcome.text}"></h1>
</body>
</html>
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng khởi động Spring bằng cách sử dụng các lệnh Maven hoặc Gradle sau:
Đối với Maven, sử dụng lệnh sau:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, hãy sử dụng lệnh sau:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, chạy tệp JAR bằng cách sử dụng lệnh như minh họa -
java –jar <JARFILE>
Bạn sẽ thấy rằng ứng dụng đã khởi động trên cổng Tomcat 8080.
Bây giờ hãy nhấn vào URL http://localhost:8080/locale trong trình duyệt web của bạn và bạn có thể thấy kết quả sau:
URL http://localhost:8080/locale?language=fr sẽ cung cấp cho bạn đầu ra như được hiển thị -
Lập lịch là một quá trình thực hiện các nhiệm vụ trong một khoảng thời gian cụ thể. Spring Boot cung cấp một sự hỗ trợ tốt để viết một lịch trình trên các ứng dụng Spring.
Biểu thức Java Cron
Biểu thức Java Cron được sử dụng để định cấu hình các thể hiện của CronTrigger, một lớp con của org.quartz.Trigger. Để biết thêm thông tin về biểu thức cron Java, bạn có thể tham khảo liên kết này:
https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm
Chú thích @EnableScheduling được sử dụng để kích hoạt bộ lập lịch cho ứng dụng của bạn. Chú thích này sẽ được thêm vào tệp lớp ứng dụng Spring Boot chính.
@SpringBootApplication
@EnableScheduling
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Chú thích @ Đã lên lịch được sử dụng để kích hoạt trình lập lịch trong một khoảng thời gian cụ thể.
@Scheduled(cron = "0 * 9 * * ?")
public void cronJobSch() throws Exception {
}
Sau đây là mã mẫu hiển thị cách thực hiện tác vụ mỗi phút bắt đầu từ 9:00 sáng và kết thúc lúc 9:59 sáng, hàng ngày
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);
}
}
Ảnh chụp màn hình sau đây cho thấy ứng dụng đã bắt đầu như thế nào lúc 09:03:23 và cứ sau một phút kể từ thời điểm đó, tác vụ lập lịch công việc cron đã được thực thi.
Tỷ lệ cố định
Bộ lập lịch Tốc độ Cố định được sử dụng để thực hiện các tác vụ tại thời điểm cụ thể. Nó không chờ đợi cho việc hoàn thành nhiệm vụ trước đó. Các giá trị phải tính bằng mili giây. Mã mẫu được hiển thị ở đây -
@Scheduled(fixedRate = 1000)
public void fixedRateSch() {
}
Mã mẫu để thực hiện một tác vụ mỗi giây kể từ khi khởi động ứng dụng được hiển thị ở đây -
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);
}
}
Quan sát ảnh chụp màn hình sau đây cho thấy ứng dụng đã bắt đầu lúc 09:12:00 và sau đó mọi tác vụ của bộ lập lịch tốc độ cố định thứ hai đã được thực thi.
Cố định độ trễ
Bộ lập lịch trễ cố định được sử dụng để thực hiện các tác vụ tại một thời điểm cụ thể. Nó sẽ đợi hoàn thành nhiệm vụ trước đó. Các giá trị phải tính bằng mili giây. Một mã mẫu được hiển thị ở đây -
@Scheduled(fixedDelay = 1000, initialDelay = 1000)
public void fixedDelaySch() {
}
Ở đây, InitialDelay là thời gian mà tác vụ sẽ được thực thi lần đầu tiên sau giá trị trễ ban đầu.
Dưới đây là một ví dụ để thực thi tác vụ mỗi giây sau 3 giây kể từ khi khởi động ứng dụng hoàn tất:
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);
}
}
Quan sát ảnh chụp màn hình sau đây cho thấy ứng dụng đã khởi động lúc 09:18:39 và cứ sau 3 giây, tác vụ lập lịch trình độ trễ cố định sẽ được thực thi trên mỗi giây.
Theo mặc định, ứng dụng Spring Boot sử dụng cổng HTTP 8080 khi ứng dụng khởi động.
Bạn cần làm theo các bước dưới đây để định cấu hình HTTPS và cổng 443 trong ứng dụng Spring Boot -
Lấy chứng chỉ SSL - Tạo chứng chỉ tự ký hoặc lấy chứng chỉ từ Tổ chức phát hành chứng chỉ
Bật HTTPS và cổng 443
Chứng chỉ tự ký
Để tạo chứng chỉ tự ký, môi trường Java Run Time đi kèm với công cụ khóa tiện ích quản lý chứng chỉ. Công cụ tiện ích này được sử dụng để tạo chứng chỉ Tự ký. Nó được hiển thị trong mã được cung cấp ở đây -
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
Mã này sẽ tạo tệp kho khóa PKCS12 có tên là keystore.p12 và tên bí danh chứng chỉ là tomcat.
Định cấu hình HTTPS
Chúng tôi cần cung cấp cổng máy chủ dưới dạng 443, đường dẫn tệp lưu trữ khóa, khóa-cửa hàng-mật khẩu, loại cửa hàng khóa và tên bí danh khóa vào tệp application.properties. Quan sát mã được cung cấp ở đây -
server.port: 443
server.ssl.key-store: keystore.p12
server.ssl.key-store-password: springboot
server.ssl.keyStoreType: PKCS12
server.ssl.keyAlias: tomcat
Bạn có thể sử dụng mã sau nếu bạn đang sử dụng thuộc tính YAML, sử dụng bên dưới application.yml -
server:
port: 443
ssl:
key-store: keystore.p12
key-store-password: springboot
keyStoreType: PKCS12
keyAlias: tomcat
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng khởi động mùa xuân bằng cách sử dụng các lệnh Maven hoặc Gradle sau.
Đối với Maven, bạn có thể sử dụng lệnh sau:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, bạn có thể sử dụng lệnh
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, hãy chạy tệp JAR bằng cách sử dụng lệnh sau:
java –jar <JARFILE>
Bây giờ, ứng dụng đã khởi động trên cổng Tomcat 443 với https như hình -
Máy chủ Eureka là một ứng dụng lưu trữ thông tin về tất cả các ứng dụng dịch vụ khách. Mọi dịch vụ Micro sẽ đăng ký vào máy chủ Eureka và máy chủ Eureka biết tất cả các ứng dụng khách đang chạy trên mỗi cổng và địa chỉ IP. Máy chủ Eureka còn được gọi là Máy chủ khám phá.
Trong chương này, chúng ta sẽ tìm hiểu chi tiết về Cách xây dựng máy chủ Eureka.
Xây dựng máy chủ Eureka
Máy chủ Eureka đi kèm với gói Spring Cloud. Đối với điều này, chúng tôi cần phát triển máy chủ Eureka và chạy nó trên cổng mặc định 8761.
Truy cập trang chủ Spring Initializer https://start.spring.io/và tải xuống dự án Spring Boot với sự phụ thuộc vào máy chủ Eureka. Nó được hiển thị trong ảnh chụp màn hình bên dưới -
Sau khi tải xuống dự án trong tệp lớp Ứng dụng Spring Boot chính, chúng ta cần thêm chú thích @EnableEurekaServer. Chú thích @EnableEurekaServer được sử dụng để làm cho ứng dụng Spring Boot của bạn hoạt động như một Máy chủ Eureka.
Mã cho tệp lớp ứng dụng Spring Boot chính như dưới đây:
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);
}
}
Đảm bảo rằng phần phụ thuộc máy chủ Spring cloud Eureka được thêm vào tệp cấu hình bản dựng của bạn.
Mã cho sự phụ thuộc của người dùng Maven được hiển thị bên dưới:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
Mã cho sự phụ thuộc của người dùng Gradle được cung cấp bên dưới:
compile('org.springframework.cloud:spring-cloud-starter-eureka-server')
Tệp cấu hình bản dựng hoàn chỉnh được cung cấp bên dưới:
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}"
}
}
Theo mặc định, Máy chủ Eureka tự đăng ký khám phá. Bạn nên thêm cấu hình đã cho bên dưới vào tệp application.properties hoặc tệp application.yml của mình.
tệp application.properties được cung cấp bên dưới -
eureka.client.registerWithEureka = false
eureka.client.fetchRegistry = false
server.port = 8761
Tệp application.yml được cung cấp bên dưới:
eureka:
client:
registerWithEureka: false
fetchRegistry: false
server:
port: 8761
Bây giờ, bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng lệnh Maven hoặc Gradle được hiển thị bên dưới:
Đối với Maven, sử dụng lệnh như hình dưới đây:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, bạn có thể sử dụng lệnh hiển thị bên dưới:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, hãy chạy tệp JAR bằng cách sử dụng lệnh sau:
java –jar <JARFILE>
Bạn có thể thấy rằng ứng dụng đã khởi động trên cổng Tomcat 8761 như hình dưới đây:
Bây giờ, hãy nhấn vào URL http://localhost:8761/ trong trình duyệt web của bạn và bạn có thể tìm thấy Máy chủ Eureka đang chạy trên cổng 8761 như hình dưới đây -
Trong chương này, bạn sẽ tìm hiểu chi tiết về Cách đăng ký ứng dụng dịch vụ Spring Boot Micro vào Máy chủ Eureka. Trước khi đăng ký ứng dụng, hãy đảm bảo Máy chủ Eureka đang chạy trên cổng 8761 hoặc trước tiên hãy xây dựng Máy chủ Eureka và chạy nó. Để biết thêm thông tin về việc xây dựng máy chủ Eureka, bạn có thể tham khảo chương trước.
Trước tiên, bạn cần thêm các phần phụ thuộc sau vào tệp cấu hình bản dựng của chúng tôi để đăng ký microservice với máy chủ Eureka.
Người dùng Maven có thể thêm các phần phụ thuộc sau vào pom.xml tập tin -
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
Người dùng Gradle có thể thêm các phần phụ thuộc sau vào build.gradle tập tin -
compile('org.springframework.cloud:spring-cloud-starter-eureka')
Bây giờ, chúng ta cần thêm chú thích @EnableEurekaClient trong tệp lớp ứng dụng Spring Boot chính. Chú thích @EnableEurekaClient làm cho ứng dụng Spring Boot của bạn hoạt động như một ứng dụng khách Eureka.
Ứng dụng Spring Boot chính như dưới đây:
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);
}
}
Để đăng ký ứng dụng Spring Boot vào Máy chủ Eureka, chúng ta cần thêm cấu hình sau vào tệp application.properties hoặc tệp application.yml và chỉ định URL Máy chủ Eureka trong cấu hình của chúng tôi.
Mã cho tệp application.yml được cung cấp bên dưới:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka
instance:
preferIpAddress: true
spring:
application:
name: eurekaclient
Mã cho tệp application.properties được cung cấp bên dưới:
eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka
eureka.client.instance.preferIpAddress = true
spring.application.name = eurekaclient
Bây giờ, thêm Rest Endpoint để trả về Chuỗi trong ứng dụng Spring Boot chính và phần phụ thuộc web Spring Boot Starter trong tệp cấu hình xây dựng. Quan sát đoạn mã dưới đây -
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";
}
}
Toàn bộ tệp cấu hình được đưa ra bên dưới.
For Maven user - pom.xml
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tutorialspoint</groupId>
<artifactId>eurekaclient</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eurekaclient</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</projecta>
For Gradle user – build.gradle
buildscript {
ext {
springBootVersion = '1.5.9.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' group = 'com.tutorialspoint' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } ext { springCloudVersion = 'Edgware.RELEASE' } dependencies { compile('org.springframework.cloud:spring-cloud-starter-eureka') testCompile('org.springframework.boot:spring-boot-starter-test') compile('org.springframework.boot:spring-boot-starter-web') } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng các lệnh Maven hoặc Gradle sau:
Đối với Maven, bạn có thể sử dụng lệnh sau:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, bạn có thể sử dụng lệnh sau:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, chạy tệp JAR bằng cách sử dụng lệnh như minh họa -
java –jar <JARFILE>
Bây giờ, ứng dụng đã khởi động trên cổng Tomcat 8080 và ứng dụng Eureka Client được đăng ký với Máy chủ Eureka như hình dưới đây -
Nhấn vào URL http: // localhost: 8761 / trong trình duyệt web của bạn và bạn có thể thấy ứng dụng Eureka Client đã được đăng ký với Eureka Server.
Bây giờ hãy nhấn vào URL http://localhost:8080/ trong trình duyệt web của bạn và xem đầu ra Điểm cuối còn lại.
Zuul Server là một ứng dụng cổng xử lý tất cả các yêu cầu và thực hiện định tuyến động của các ứng dụng microservice. Máy chủ Zuul còn được gọi là Máy chủ Edge.
Ví dụ, /api/user được ánh xạ tới dịch vụ người dùng và / api / products được ánh xạ tới dịch vụ sản phẩm và Zuul Server tự động định tuyến các yêu cầu đến ứng dụng phụ trợ tương ứng.
Trong chương này, chúng ta sẽ xem chi tiết cách tạo ứng dụng Zuul Server trong Spring Boot.
Tạo ứng dụng máy chủ Zuul
Máy chủ Zuul đi kèm với sự phụ thuộc vào Spring Cloud. Bạn có thể tải xuống dự án Spring Boot từ trang Spring Initializerhttps://start.spring.io/ và chọn phần phụ thuộc Máy chủ Zuul.
Thêm chú thích @EnableZuulProxy trên ứng dụng Spring Boot chính của bạn. Chú thích @EnableZuulProxy được sử dụng để làm cho ứng dụng Spring Boot của bạn hoạt động như một máy chủ Zuul Proxy.
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);
}
}
Bạn sẽ phải thêm phần phụ thuộc Spring Cloud Starter Zuul vào tệp cấu hình bản dựng của chúng tôi.
Người dùng Maven sẽ phải thêm phần phụ thuộc sau vào pom.xml tập tin -
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
Đối với người dùng Gradle, hãy thêm phần phụ thuộc bên dưới vào tệp build.gradle của bạn
compile('org.springframework.cloud:spring-cloud-starter-zuul')
Đối với định tuyến Zuul, hãy thêm các thuộc tính dưới đây vào tệp application.properties hoặc tệp application.yml của bạn.
spring.application.name = zuulserver
zuul.routes.products.path = /api/demo/**
zuul.routes.products.url = http://localhost:8080/
server.port = 8111
Điều này có nghĩa là http gọi đến /api/demo/được chuyển tiếp đến dịch vụ sản phẩm. Ví dụ,/api/demo/products được chuyển tiếp đến /products.
người dùng tệp yaml có thể sử dụng tệp application.yml được hiển thị bên dưới -
server:
port: 8111
spring:
application:
name: zuulserver
zuul:
routes:
products:
path: /api/demo/**
url: http://localhost:8080/
Note - Sự http://localhost:8080/ ứng dụng phải đang chạy trước khi định tuyến qua Zuul Proxy.
Tệp cấu hình bản dựng hoàn chỉnh được cung cấp bên dưới.
Người dùng Maven có thể sử dụng tệp pom.xml được cung cấp bên dưới:
<?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>
Người dùng Gradle có thể sử dụng tệp build.gradle được cung cấp bên dưới:
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}"
}
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng lệnh Maven hoặc Gradle được cung cấp bên dưới:
Đối với Maven, bạn có thể sử dụng lệnh dưới đây:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, bạn có thể sử dụng lệnh dưới đây:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, chạy tệp JAR bằng cách sử dụng lệnh hiển thị bên dưới:
java –jar <JARFILE>
Bạn có thể tìm thấy ứng dụng đã khởi động trên cổng Tomcat 8111 như được hiển thị ở đây.
Bây giờ, hãy nhấn vào URL http://localhost:8111/api/demo/products trong trình duyệt web của bạn và bạn có thể thấy đầu ra của /products REST Endpoint như hình dưới đây -
Máy chủ cấu hình đám mây mùa xuân là một ứng dụng tập trung quản lý tất cả các thuộc tính cấu hình liên quan đến ứng dụng. Trong chương này, bạn sẽ tìm hiểu chi tiết về cách tạo máy chủ Cấu hình đám mây mùa xuân.
Tạo máy chủ cấu hình đám mây mùa xuân
Đầu tiên, tải xuống dự án Spring Boot từ trang Spring Initializer và chọn phần phụ thuộc Spring Cloud Config Server. Quan sát ảnh chụp màn hình dưới đây -
Bây giờ, hãy thêm sự phụ thuộc của máy chủ Spring Cloud Config vào tệp cấu hình bản dựng của bạn như được giải thích bên dưới -
Người dùng Maven có thể thêm phần phụ thuộc bên dưới vào tệp pom.xml.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
Người dùng Gradle có thể thêm phần phụ thuộc bên dưới vào tệp build.gradle của bạn.
compile('org.springframework.cloud:spring-cloud-config-server')
Bây giờ, hãy thêm chú thích @EnableConfigServer vào tệp lớp ứng dụng Spring Boot chính của bạn. Chú thích @EnableConfigServer làm cho ứng dụng Spring Boot của bạn hoạt động như một Máy chủ cấu hình.
Tệp lớp ứng dụng Spring Boot chính được cung cấp bên dưới:
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);
}
}
Bây giờ, hãy thêm cấu hình bên dưới vào tệp thuộc tính của bạn và thay thế tệp application.properties thành tệp bootstrap.properties. Quan sát đoạn mã dưới đây -
server.port = 8888
spring.cloud.config.server.native.searchLocations=file:///C:/configprop/
SPRING_PROFILES_ACTIVE=native
Máy chủ cấu hình chạy trên cổng Tomcat 8888 và các thuộc tính cấu hình ứng dụng được tải từ các vị trí tìm kiếm gốc.
Bây giờ, trong file:///C:/configprop/, đặt ứng dụng khách của bạn - tệp application.properties. Ví dụ: tên ứng dụng khách của bạn làconfig-client, sau đó đổi tên tệp application.properties của bạn thành config-client.properties và đặt tệp thuộc tính trên đường dẫn file:///C:/configprop/.
Mã cho tệp thuộc tính máy khách cấu hình được cung cấp bên dưới:
welcome.message = Welcome to Spring cloud config server
Tệp cấu hình bản dựng hoàn chỉnh được cung cấp bên dưới:
Người dùng Maven có thể sử dụng pom.xml đưa ra dưới đây -
<?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>
Người dùng Gradle có thể sử dụng tệp build.gradle được cung cấp bên dưới:
<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}"
}
}
Bây giờ, tạo một tệp JAR có thể thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng các lệnh Maven hoặc Gradle sau:
Đối với Maven, hãy sử dụng lệnh dưới đây:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, hãy sử dụng lệnh dưới đây:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Chạy tệp JAR bằng cách sử dụng lệnh sau:
java –jar <JARFILE>
Bây giờ, ứng dụng đã khởi động trên cổng Tomcat 8888 như được hiển thị ở đây -
Bây giờ hãy nhấn vào URL http://localhost:8888/config-client/default/master trên trình duyệt web của bạn và bạn có thể thấy các thuộc tính cấu hình ứng dụng máy khách cấu hình của mình như được hiển thị ở đây.
Một số ứng dụng có thể cần thuộc tính cấu hình có thể cần thay đổi và nhà phát triển có thể cần gỡ chúng xuống hoặc khởi động lại ứng dụng để thực hiện việc này. Tuy nhiên, điều này có thể dẫn đến thời gian ngừng hoạt động trong quá trình sản xuất và yêu cầu khởi động lại ứng dụng. Máy chủ cấu hình đám mây mùa xuân cho phép các nhà phát triển tải các thuộc tính cấu hình mới mà không cần khởi động lại ứng dụng và không có bất kỳ thời gian chết nào.
Làm việc với Máy chủ cấu hình đám mây mùa xuân
Đầu tiên, tải xuống dự án Spring Boot từ https://start.spring.io/và chọn sự phụ thuộc vào Spring Cloud Config Client. Bây giờ, thêm phần phụ thuộc Spring Cloud Starter Config vào tệp cấu hình bản dựng của bạn.
Người dùng Maven có thể thêm phần phụ thuộc sau vào tệp pom.xml.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
Người dùng Gradle có thể thêm phần phụ thuộc sau vào build.gradle tập tin.
compile('org.springframework.cloud:spring-cloud-starter-config')
Bây giờ, bạn cần thêm chú thích @RefreshScope vào ứng dụng Spring Boot chính của mình. Chú thích @RefreshScope được sử dụng để tải giá trị thuộc tính cấu hình từ máy chủ Cấu hình.
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);
}
}
Bây giờ, hãy thêm URL máy chủ cấu hình vào tệp application.properties của bạn và cung cấp tên ứng dụng của bạn.
Note - http: // localhost: Máy chủ cấu hình 8888 nên được chạy trước khi khởi động ứng dụng máy khách cấu hình.
spring.application.name = config-client
spring.cloud.config.uri = http://localhost:8888
Mã để viết một Điểm cuối REST đơn giản để đọc thông báo chào mừng từ máy chủ cấu hình được đưa ra dưới đây:
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;
}
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng các lệnh Maven hoặc Gradle sau:
Đối với Maven, bạn có thể sử dụng lệnh hiển thị bên dưới:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, bạn có thể sử dụng lệnh hiển thị bên dưới:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, chạy tệp JAR bằng cách sử dụng lệnh hiển thị ở đây:
java –jar <JARFILE>
Bây giờ, ứng dụng đã khởi động trên cổng Tomcat 8080 như được hiển thị ở đây -
Bạn có thể thấy cửa sổ đăng nhập bảng điều khiển; ứng dụng config-client đang tìm nạp cấu hình từ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
Bây giờ hãy nhấn vào URL, http://localhost:8080/ thông báo chào mừng được tải từ máy chủ cấu hình.
Bây giờ, hãy đi và thay đổi giá trị thuộc tính trên máy chủ Cấu hình và nhấn URL POST của thiết bị truyền động http://localhost:8080/refresh và xem giá trị thuộc tính cấu hình mới trong URL http://localhost:8080/
Spring Boot Actuator cung cấp các điểm cuối bảo mật để theo dõi và quản lý ứng dụng Spring Boot của bạn. Theo mặc định, tất cả các điểm cuối của bộ truyền động đều được bảo mật. Trong chương này, bạn sẽ tìm hiểu chi tiết về cách bật bộ truyền động Spring Boot cho ứng dụng của bạn.
Bật bộ truyền động khởi động mùa xuân
Để bật điểm cuối của bộ truyền động Spring Boot vào ứng dụng Spring Boot của bạn, chúng tôi cần thêm phần phụ thuộc của bộ truyền động Spring Boot Starter vào tệp cấu hình bản dựng của chúng tôi.
Người dùng Maven có thể thêm phần phụ thuộc bên dưới vào tệp pom.xml của bạn.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Người dùng Gradle có thể thêm phần phụ thuộc bên dưới vào tệp build.gradle của bạn.
compile group: 'org.springframework.boot', name: 'spring-boot-starter-actuator'
Trong tệp application.properties, chúng ta cần tắt bảo mật cho các điểm cuối của bộ truyền động.
management.security.enabled = false
Người dùng tệp YAML có thể thêm thuộc tính sau vào tệp application.yml của bạn.
management:
security:
enabled: false
Nếu bạn muốn sử dụng số cổng riêng để truy cập điểm cuối của bộ truyền động khởi động Spring, hãy thêm số cổng quản lý trong tệp application.properties.
management.port = 9000
Người dùng tệp YAML có thể thêm thuộc tính sau vào tệp application.yml của bạn.
management:
port: 9000
Bây giờ, bạn có thể tạo một tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng các lệnh Maven hoặc Gradle sau đây.
Đối với Maven, bạn có thể sử dụng lệnh sau:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, bạn có thể sử dụng lệnh sau:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, bạn có thể chạy tệp JAR bằng cách sử dụng lệnh sau:
java –jar <JARFILE>
Bây giờ, ứng dụng đã khởi động trên cổng Tomcat 8080. Lưu ý rằng nếu bạn đã chỉ định số cổng quản lý, thì cùng một ứng dụng đang chạy trên hai số cổng khác nhau.
Dưới đây là một số điểm cuối quan trọng của Spring Boot Actuator. Bạn có thể nhập chúng vào trình duyệt web và theo dõi hành vi ứng dụng của mình.
KẾT THÚC | SỬ DỤNG |
---|---|
/ metrics | Để xem các chỉ số của ứng dụng như bộ nhớ được sử dụng, bộ nhớ trống, luồng, lớp, thời gian hoạt động của hệ thống, v.v. |
/ env | Để xem danh sách các biến Môi trường được sử dụng trong ứng dụng. |
/ đậu | Để xem Spring bean và các loại, phạm vi và sự phụ thuộc của nó. |
/Sức khỏe | Để xem tình trạng ứng dụng |
/ thông tin | Để xem thông tin về ứng dụng Spring Boot. |
/ dấu vết | Để xem danh sách Dấu vết của điểm cuối Rest của bạn. |
Việc giám sát ứng dụng của bạn bằng cách sử dụng Spring Boot Actuator Endpoint hơi khó. Bởi vì, nếu bạn có 'n' số ứng dụng, thì mọi ứng dụng đều có các điểm cuối thiết bị truyền động riêng biệt, do đó việc giám sát trở nên khó khăn. Spring Boot Admin Server là ứng dụng dùng để quản lý và giám sát ứng dụng Microservice của bạn.
Để xử lý các tình huống như vậy, Nhóm CodeCentric cung cấp Giao diện người dùng quản trị Spring Boot để quản lý và giám sát tất cả các điểm cuối Bộ truyền động ứng dụng Spring Boot của bạn tại một nơi.
Để xây dựng Máy chủ quản trị Spring Boot, chúng tôi cần thêm các phần phụ thuộc bên dưới vào tệp cấu hình xây dựng của bạn.
Người dùng Maven có thể thêm các phần phụ thuộc bên dưới vào tệp pom.xml của bạn -
<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>
Người dùng Gradle có thể thêm các phần phụ thuộc bên dưới vào tệp build.gradle của bạn -
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'
Thêm chú thích @EnableAdminServer vào tệp lớp ứng dụng Spring Boot chính của bạn. Chú thích @EnableAdminServer được sử dụng để đặt làm Máy chủ quản trị của bạn để giám sát tất cả các dịch vụ nhỏ khác.
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);
}
}
Bây giờ, hãy xác định server.port và tên ứng dụng trong tệp application.properties như sau:
server.port = 9090
spring.application.name = adminserver
Đối với người dùng YAML, hãy sử dụng các thuộc tính sau để xác định số cổng và tên ứng dụng trong tệp application.yml.
server:
port: 9090
spring:
application:
name: adminserver
Tệp cấu hình bản dựng được đưa ra bên dưới.
For Maven users – pom.xml
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tutorialspoint</groupId>
<artifactId>adminserver</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>adminserver</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-server</artifactId>
<version>1.5.5</version>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-server-ui</artifactId>
<version>1.5.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
For Gradle users – build.gradle file
buildscript {
ext {
springBootVersion = '1.5.9.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile('org.springframework.boot:spring-boot-starter')
compile group: 'de.codecentric', name: 'spring-boot-admin-server', version: '1.5.5'
compile group: 'de.codecentric', name: 'spring-boot-admin-server-ui', version: '1.5.5'
testCompile('org.springframework.boot:spring-boot-starter-test')
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng các lệnh Maven hoặc Gradle sau:
Đối với Maven, sử dụng lệnh hiển thị ở đây -
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, sử dụng lệnh hiển thị ở đây -
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, hãy chạy tệp JAR bằng cách sử dụng lệnh dưới đây:
java –jar <JARFILE>
Bây giờ, ứng dụng đã khởi động trên cổng Tomcat 9090 như được hiển thị ở đây -
Bây giờ, hãy nhấp vào URL bên dưới từ trình duyệt web của bạn và xem Giao diện người dùng máy chủ quản trị.
http://localhost:9090/
Để theo dõi và quản lý ứng dụng microservice của bạn thông qua Máy chủ quản trị Spring Boot, bạn nên thêm phần phụ thuộc máy khách khởi động Spring Boot Admin và chỉ ra URI của máy chủ quản trị vào tệp thuộc tính ứng dụng.
Note - Để giám sát một ứng dụng, bạn nên bật Điểm cuối của Bộ truyền động khởi động mùa xuân cho ứng dụng Microservice của mình.
Đầu tiên, thêm phần phụ thuộc máy khách khởi động Spring Boot Admin sau đây và phần phụ thuộc bộ truyền động khởi động Spring Boot vào tệp cấu hình bản dựng của bạn.
Người dùng Maven có thể thêm các phần phụ thuộc sau vào tệp pom.xml của bạn -
<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>
Người dùng Gradle có thể thêm các phần phụ thuộc sau vào tệp build.gradle của bạn.
compile group: 'de.codecentric', name: 'spring-boot-admin-starter-client', version: '1.5.5'
compile('org.springframework.boot:spring-boot-starter-actuator')
Bây giờ, hãy thêm URL máy chủ quản trị Spring Boot vào tệp thuộc tính ứng dụng của bạn.
Đối với người dùng tệp thuộc tính, hãy thêm các thuộc tính sau vào tệp application.properties.
spring.boot.admin.url = http://localhost:9090/
Đối với người dùng YAML, hãy thêm thuộc tính sau vào tệp application.yml.
spring:
boot:
admin:
url: http://localhost:9000/
Bây giờ, tạo một tệp JAR có thể thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng các lệnh Maven hoặc Gradle sau.
Đối với Maven, bạn có thể sử dụng lệnh như hình:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, bạn có thể sử dụng lệnh như sau:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, hãy chạy tệp JAR bằng cách sử dụng lệnh được hiển thị:
java –jar <JARFILE>
Bây giờ, ứng dụng đã khởi động trên cổng Tomcat 9090 như được hiển thị -
Bây giờ, hãy nhấn vào URL sau từ trình duyệt web của bạn và xem ứng dụng Spring Boot của bạn đã được đăng ký với Spring Boot Admin Server.
http://localhost:9090/
Bây giờ, hãy nhấp vào Details và xem các điểm cuối của bộ truyền động trong Giao diện người dùng máy chủ quản trị.
Swagger2 là một dự án mã nguồn mở được sử dụng để tạo các tài liệu API REST cho các dịch vụ web RESTful. Nó cung cấp giao diện người dùng để truy cập các dịch vụ web RESTful của chúng tôi thông qua trình duyệt web.
Để bật Swagger2 trong ứng dụng Spring Boot, bạn cần thêm các phần phụ thuộc sau vào tệp cấu hình bản dựng của chúng tôi.
<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>
Đối với người dùng Gradle, hãy thêm các phần phụ thuộc sau vào tệp build.gradle của bạn.
compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.7.0'
compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.7.0'
Bây giờ, thêm chú thích @ EnableSwagger2 trong ứng dụng Spring Boot chính của bạn. Chú thích @ EnableSwagger2 được sử dụng để kích hoạt Swagger2 cho ứng dụng Spring Boot của bạn.
Mã cho ứng dụng Spring Boot chính được hiển thị bên dưới:
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);
}
}
Tiếp theo, tạo Docket Bean để cấu hình Swagger2 cho ứng dụng Spring Boot của bạn. Chúng ta cần xác định gói cơ sở để định cấu hình (các) API REST cho Swagger2.
@Bean
public Docket productApi() {
return new Docket(DocumentationType.SWAGGER_2).select()
.apis(RequestHandlerSelectors.basePackage("com.tutorialspoint.swaggerdemo")).build();
}
Bây giờ, thêm bean này vào tệp chính của lớp ứng dụng Spring Boot và lớp ứng dụng Spring Boot chính của bạn sẽ trông như hình dưới đây:
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();
}
}
Bây giờ, hãy thêm phần phụ thuộc Spring Boot Starter Web bên dưới vào tệp cấu hình bản dựng của bạn để viết REST Endpoints như được hiển thị bên dưới:
Người dùng Maven có thể thêm phần phụ thuộc sau vào tệp pom.xml của bạn -
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Người dùng Gradle có thể thêm phần phụ thuộc sau vào tệp build.gradle -
compile('org.springframework.boot:spring-boot-starter-web')
Bây giờ, mã để xây dựng hai dịch vụ web RESTful đơn giản GET và POST trong tệp Rest Controller được hiển thị ở đây -
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";
}
}
Tệp cấu hình bản dựng hoàn chỉnh được cung cấp bên dưới:
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'
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng các lệnh Maven hoặc Gradle sau.
Đối với Maven, bạn có thể sử dụng lệnh hiển thị ở đây -
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, bạn có thể sử dụng lệnh như được hiển thị ở đây -
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, chạy tệp JAR bằng cách sử dụng lệnh hiển thị ở đây -
java –jar <JARFILE>
Bây giờ, ứng dụng sẽ khởi động trên cổng Tomcat 8080 như được hiển thị -
Bây giờ, hãy nhấn vào URL trong trình duyệt web của bạn và xem các chức năng của Swagger API.
http://localhost:8080/swagger-ui.html
Docker là một dịch vụ quản lý vùng chứa giúp dễ dàng xây dựng và triển khai. Nếu bạn là người mới bắt đầu sử dụng Docker, bạn có thể tìm hiểu chi tiết tại liên kết này -https://www.tutorialspoint.com/docker/index.htm
Trong chương này, chúng ta sẽ xem Cách tạo hình ảnh Docker bằng cách sử dụng các phụ thuộc Maven và Gradle cho ứng dụng Spring Boot của bạn.
Tạo Dockerfile
Đầu tiên, hãy tạo một tệp với tên Dockerfile dưới các thư mục src/main/dockervới nội dung hiển thị bên dưới. Lưu ý rằng tệp này rất quan trọng để tạo hình ảnh 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
Đối với Maven, hãy thêm plugin Docker Maven vào tệp cấu hình bản dựng của bạn 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>
Tệp pom.xml hoàn chỉnh được cung cấp bên dưới:
<?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>
Bây giờ, bạn có thể chạy ứng dụng của mình bằng cách sử dụng lệnh Maven mvn package docker:build
Note - Bật trình nền Expose trên tcp://localhost:2375 không có TLS.
Sau khi xây dựng thành công, bạn có thể thấy đầu ra trên bảng điều khiển như hình dưới đây:
Bây giờ, hãy xem hình ảnh Docker bằng lệnh sử dụng hình ảnh docker và xem thông tin hình ảnh trên bảng điều khiển.
Gradle
Để tạo hình ảnh Docker bằng cách sử dụng cấu hình bản dựng Gradle, chúng ta cần thêm docker plugin và cần viết một nhiệm vụ buildDocker để tạo hình ảnh Docker.
Mã cho cấu hình Gradle Docker được đưa ra bên dưới.
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
}
}
}
Tệp build.gradle hoàn chỉnh được cung cấp bên dưới.
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
}
}
}
Bây giờ, hãy tạo một hình ảnh Docker bằng cách sử dụng lệnh hiển thị bên dưới:
gradle build buildDocker
Sau khi thực hiện lệnh, bạn có thể thấy nhật ký XÂY DỰNG THÀNH CÔNG trên cửa sổ giao diện điều khiển.
Bây giờ, hãy xem các hình ảnh Docker bằng lệnh sử dụng docker images và xem thông tin của hình ảnh trên bảng điều khiển.
Hầu hết các nhà phát triển gặp khó khăn trong việc truy tìm nhật ký nếu có bất kỳ sự cố nào xảy ra. Điều này có thể được giải quyết bằng máy chủ Spring Cloud Sleuth và ZipKin cho ứng dụng Spring Boot.
Spring Cloud Sleuth
Nhật ký Spring cloud Sleuth được in ở định dạng sau:
[application-name,traceid,spanid,zipkin-export]
Ở đâu,
Application-name = Tên của ứng dụng
Traceid = mỗi yêu cầu và phản hồi theo dõi đều giống nhau khi gọi cùng một dịch vụ hoặc một dịch vụ đến một dịch vụ khác.
Spanid = Span Id được in cùng với Trace Id. Span Id là khác nhau mọi yêu cầu và phản hồi gọi một dịch vụ đến một dịch vụ khác.
Zipkin-export = Theo mặc định, nó là false. Nếu đúng, nhật ký sẽ được xuất sang máy chủ Zipkin.
Bây giờ, hãy thêm phần phụ thuộc Spring Cloud Starter Sleuth vào tệp cấu hình bản dựng của bạn như sau:
Người dùng Maven có thể thêm phần phụ thuộc sau vào tệp pom.xml của bạn -
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
Người dùng Gradle có thể thêm phần phụ thuộc sau vào tệp build.gradle của bạn -
compile('org.springframework.cloud:spring-cloud-starter-sleuth')
Bây giờ, thêm Nhật ký vào tệp lớp Rest Controller của ứng dụng Spring Boot của bạn như được hiển thị ở đây -
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!";
}
}
Bây giờ, hãy thêm tên ứng dụng vào tệp application.properties như được hiển thị -
spring.application.name = tracinglogs
Mã hoàn chỉnh cho tệp cấu hình bản dựng được cung cấp bên dưới:
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}"
}
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng các lệnh Maven hoặc Gradle sau.
Đối với Maven, bạn có thể sử dụng lệnh sau:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, bạn có thể sử dụng lệnh sau:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, chạy tệp JAR bằng cách sử dụng lệnh hiển thị ở đây -
java –jar <JARFILE>
Bây giờ, ứng dụng đã khởi động trên cổng Tomcat 8080.
Bây giờ, hãy nhấn vào URL trong trình duyệt web của bạn và xem đầu ra trong nhật ký bảng điều khiển.
http://localhost:8080/
Bạn có thể xem các nhật ký sau trong cửa sổ bảng điều khiển. Quan sát rằng nhật ký được in ở định dạng sau [tên ứng dụng, theo dõi, spanid, zipkin-export]
Máy chủ Zipkin
Zipkin là một ứng dụng giám sát và quản lý nhật ký Spring Cloud Sleuth của ứng dụng Spring Boot của bạn. Để xây dựng máy chủ Zipkin, chúng ta cần thêm giao diện người dùng Zipkin và các phụ thuộc Máy chủ Zipkin vào tệp cấu hình xây dựng của chúng tôi.
Người dùng Maven có thể thêm phần phụ thuộc sau vào tệp pom.xml của bạn -
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
Người dùng Gradle có thể thêm phần phụ thuộc bên dưới vào tệp build.gradle của bạn -
compile('io.zipkin.java:zipkin-autoconfigure-ui')
compile('io.zipkin.java:zipkin-server')
Bây giờ, hãy cấu hình server.port = 9411 trong tệp thuộc tính ứng dụng.
Đối với người dùng tệp thuộc tính, hãy thêm thuộc tính dưới đây vào tệp application.properties.
server.port = 9411
Đối với người dùng YAML, hãy thêm thuộc tính dưới đây vào tệp application.yml.
server:
port: 9411
Thêm chú thích @EnableZipkinServer vào lớp ứng dụng Spring Boot chính của bạn. Chú thích @EnableZipkinServer được sử dụng để cho phép ứng dụng của bạn hoạt động như một máy chủ 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);
}
}
Mã cho tệp cấu hình bản dựng hoàn chỉnh được cung cấp bên dưới.
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}"
}
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng lệnh Maven hoặc Gradle bên dưới:
Đối với Maven, hãy sử dụng lệnh dưới đây:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, hãy sử dụng lệnh dưới đây:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Chạy tệp JAR bằng cách sử dụng lệnh hiển thị:
java –jar <JARFILE>
Bây giờ, ứng dụng đã khởi động trên cổng Tomcat 9411 như hình dưới đây -
Bây giờ, hãy nhấn vào URL bên dưới và xem giao diện người dùng máy chủ Zipkin.
http://localhost:9411/zipkin/
Sau đó, thêm phần phụ thuộc sau vào ứng dụng dịch vụ khách hàng của bạn và chỉ ra URL máy chủ Zipkin để theo dõi nhật ký microservice thông qua giao diện người dùng Zipkin.
Bây giờ, thêm phần phụ thuộc Spring Cloud Starter Zipkin vào tệp cấu hình bản dựng của bạn như được hiển thị -
Người dùng Maven có thể thêm phần phụ thuộc sau vào tệp pom.xml:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
Người dùng Gradle có thể thêm phần phụ thuộc bên dưới vào tệp build.gradle -
compile('org.springframework.cloud:spring-cloud-sleuth-zipkin')
Bây giờ, hãy thêm Always Sampler Bean trong ứng dụng Spring Boot của bạn để xuất nhật ký vào máy chủ Zipkin.
@Bean
public AlwaysSampler defaultSampler() {
return new AlwaysSampler();
}
Nếu bạn thêm AlwaysSampler Bean, thì tùy chọn Spring Sleuth Zipkin Export sẽ tự động thay đổi từ false thành true.
Tiếp theo, định cấu hình URL cơ sở Máy chủ Zipkin của bạn trong tệp ứng dụng khách dịch vụ ứng dụng.properties.
spring.zipkin.baseUrl = http://localhost:9411/zipkin/
Sau đó, cung cấp id theo dõi và tìm các dấu vết trong Zipkin UI.
http://localhost:9411/zipkin/traces/{traceid}/
Flyway là một ứng dụng kiểm soát phiên bản để phát triển lược đồ Cơ sở dữ liệu của bạn một cách dễ dàng và đáng tin cậy trên tất cả các phiên bản của bạn. Để tìm hiểu thêm về Flyway, bạn có thể sử dụng liên kết - www.flywaydb.org
Nhiều dự án phần mềm sử dụng cơ sở dữ liệu quan hệ. Điều này yêu cầu xử lý di chuyển cơ sở dữ liệu, còn thường được gọi là di chuyển lược đồ.
Trong chương này, bạn sẽ tìm hiểu chi tiết về cách cấu hình cơ sở dữ liệu Flyway trong ứng dụng Spring Boot của bạn.
Cấu hình cơ sở dữ liệu Flyway
Đầu tiên, tải xuống dự án Spring Boot từ trang Spring Initializer www.start.spring.io và chọn các phần phụ thuộc sau:
- Web khởi động mùa xuân
- Flyway
- MySQL
- JDBC
Người dùng Maven có thể thêm các phần phụ thuộc sau vào tệp 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>
Người dùng Gradle có thể thêm các phần phụ thuộc sau vào tệp 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')
Trong thuộc tính ứng dụng, chúng ta cần định cấu hình các thuộc tính cơ sở dữ liệu để tạo Nguồn dữ liệu và cũng như các thuộc tính đường bay mà chúng ta cần cấu hình trong thuộc tính ứng dụng.
Đối với người dùng tệp thuộc tính, hãy thêm các thuộc tính dưới đây vào tệp 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
Người dùng YAML có thể thêm các thuộc tính sau trong tệp 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"
Bây giờ, hãy tạo một tệp SQL trong src/main/resources/db/migrationdanh mục. Đặt tên tệp SQL là “V1__Initial.sql”
CREATE TABLE USERS (ID INT AUTO_INCREMENT PRIMARY KEY, USERID VARCHAR(45));
INSERT INTO USERS (ID, USERID) VALUES (1, 'tutorialspoint.com');
Mã tệp lớp ứng dụng Spring Boot chính được cung cấp bên dưới:
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);
}
}
Tệp cấu hình bản dựng hoàn chỉnh được cung cấp bên dưới.
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')
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng lệnh Maven hoặc Gradle được cung cấp bên dưới:
Đối với Maven, bạn có thể sử dụng lệnh hiển thị ở đây -
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, bạn có thể sử dụng lệnh hiển thị ở đây -
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, hãy chạy tệp JAR bằng cách sử dụng lệnh sau:
java –jar <JARFILE>
Bây giờ, Tomcat đã bắt đầu trên cổng 8080 và trong cửa sổ bảng điều khiển, bạn có thể xem nhật ký cơ sở dữ liệu đường bay như được hiển thị ở đây.
Bây giờ bạn có thể truy cập cơ sở dữ liệu và thực hiện các truy vấn đã chọn.
Bằng cách sử dụng dịch vụ web Spring Boot RESTful, bạn có thể gửi email với Bảo mật lớp truyền tải của Gmail. Trong chương này, chúng ta hãy hiểu chi tiết cách sử dụng tính năng này.
Đầu tiên, chúng ta cần thêm phần phụ thuộc Spring Boot Starter Mail vào tệp cấu hình bản dựng của bạn.
Người dùng Maven có thể thêm phần phụ thuộc sau vào tệp pom.xml.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
Người dùng Gradle có thể thêm phần phụ thuộc sau vào tệp build.gradle của bạn.
compile('org.springframework.boot:spring-boot-starter-mail')
Mã của tệp lớp ứng dụng Spring Boot chính được đưa ra dưới đây:
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);
}
}
Bạn có thể viết một API Rest đơn giản để gửi đến email trong tệp lớp Rest Controller như hình minh họa.
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";
}
}
Bạn có thể viết một phương thức để gửi email với Đính kèm. Xác định thuộc tính mail.smtp và PasswordAuthentication đã sử dụng.
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);
}
Bây giờ, hãy gọi phương thức sendmail () ở trên từ API Rest như được hiển thị -
@RequestMapping(value = "/sendemail")
public String sendEmail() throws AddressException, MessagingException, IOException {
sendmail();
return "Email sent successfully";
}
Note - Vui lòng BẬT cho phép các ứng dụng kém an toàn hơn trong cài đặt tài khoản Gmail của bạn trước khi gửi email.
Tệp cấu hình bản dựng hoàn chỉnh được cung cấp bên dưới.
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')
}
Bây giờ, bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng lệnh Maven hoặc Gradle được hiển thị bên dưới:
Đối với Maven, bạn có thể sử dụng lệnh như hình:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, bạn có thể sử dụng lệnh như sau:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, hãy chạy tệp JAR bằng cách sử dụng lệnh dưới đây:
java –jar <JARFILE>
Bạn có thể thấy rằng ứng dụng đã khởi động trên cổng Tomcat 8080.
Bây giờ hãy nhấn vào URL sau từ trình duyệt web của bạn và bạn sẽ nhận được một email.
http://localhost:8080/sendemail
Hystrix là một thư viện từ Netflix. Hystrix cô lập các điểm truy cập giữa các dịch vụ, dừng các lỗi xếp tầng trên chúng và cung cấp các tùy chọn dự phòng.
Ví dụ: khi bạn đang gọi một ứng dụng của bên thứ 3 , sẽ mất nhiều thời gian hơn để gửi phản hồi. Vì vậy, tại thời điểm đó, điều khiển chuyển sang phương thức dự phòng và trả về phản hồi tùy chỉnh cho ứng dụng của bạn.
Trong chương này, bạn sẽ xem Cách triển khai Hystrix trong ứng dụng Spring Boot.
Đầu tiên, chúng ta cần thêm phần phụ thuộc Spring Cloud Starter Hystrix vào tệp cấu hình bản dựng của mình.
Người dùng Maven có thể thêm phần phụ thuộc sau vào tệp pom.xml:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
Người dùng Gradle có thể thêm phần phụ thuộc sau vào tệp build.gradle -
compile('org.springframework.cloud:spring-cloud-starter-hystrix')
Bây giờ, thêm chú thích @EnableHystrix vào tệp lớp ứng dụng Spring Boot chính của bạn. Chú thích @EnableHystrix được sử dụng để kích hoạt các chức năng Hystrix vào ứng dụng Spring Boot của bạn.
Mã tệp lớp ứng dụng Spring Boot chính được cung cấp bên dưới:
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);
}
}
Bây giờ viết một Rest Controller đơn giản để nó trả về Chuỗi sau 3 giây kể từ thời gian được yêu cầu.
@RequestMapping(value = "/")
public String hello() throws InterruptedException {
Thread.sleep(3000);
return "Welcome Hystrix";
}
Bây giờ, hãy thêm lệnh @Hystrix và @HystrixProperty cho API Rest và xác định thời gian chờ theo giá trị mili giây.
@HystrixCommand(fallbackMethod = "fallback_hello", commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
})
Tiếp theo, xác định phương thức dự phòng fallback_hello () nếu yêu cầu mất nhiều thời gian để phản hồi.
private String fallback_hello() {
return "Request fails. It takes long time to response";
}
Tệp lớp Rest Controller hoàn chỉnh có chứa các thuộc tính REST API và Hystrix được hiển thị ở đây -
@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";
}
Trong ví dụ này, API REST được viết trong chính tệp lớp ứng dụng Spring Boot chính.
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";
}
}
Tệp cấu hình bản dựng hoàn chỉnh được cung cấp bên dưới.
Maven – pom.xml file
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tutorialspoint</groupId>
<artifactId>hystrixapp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>hystrixapp</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Gradle – build.gradle
buildscript {
ext {
springBootVersion = '1.5.9.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
ext {
springCloudVersion = 'Edgware.RELEASE'
}
dependencies {
compile('org.springframework.cloud:spring-cloud-starter-hystrix')
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng các lệnh Maven hoặc Gradle sau:
Đối với Maven, sử dụng lệnh như minh họa -
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, sử dụng lệnh như minh họa -
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, hãy chạy tệp JAR bằng cách sử dụng lệnh dưới đây:
java –jar <JARFILE>
Thao tác này sẽ khởi động ứng dụng trên cổng Tomcat 8080 như hình dưới đây -
Bây giờ, hãy nhấn vào URL http://localhost:8080/từ trình duyệt web của bạn và xem phản hồi Hystrix. API mất 3 giây để phản hồi, nhưng thời gian chờ của Hystrix là 1 giây.
Trong chương này, chúng ta hãy hiểu cách xây dựng một ứng dụng web tương tác bằng cách sử dụng Spring Boot với các ổ cắm Web.
Để xây dựng một ứng dụng web tương tác trong Spring Boot với Web socket, bạn cần thêm các phần phụ thuộc sau.
Người dùng Maven nên thêm các phần phụ thuộc sau vào tệp 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>
Người dùng Gradle có thể thêm các phần phụ thuộc sau vào tệp build.gradle của bạn -
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")
Hãy để chúng tôi tạo một bộ điều khiển xử lý tin nhắn để làm việc với tin nhắn STOMP. Thông báo STOMP có thể được chuyển đến tệp lớp @Controller. Ví dụ, GreetingController được ánh xạ để xử lý các thông báo đến đích “/ hello”.
package com.tutorialspoint.websocketapp;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
@Controller
public class GreetingController {
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception {
Thread.sleep(1000); // simulated delay
return new Greeting("Hello, " + message.getName() + "!");
}
}
Bây giờ, hãy cấu hình Spring cho nhắn tin STOMP. Viết tệp lớp WebSocketConfig mở rộng lớp AbstractWebSocketMessageBrokerConfigurer như hình dưới đây.
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();
}
}
Chú thích @EnableWebSocketMessageBroker được sử dụng để định cấu hình trình môi giới thông báo socket Web để tạo các điểm cuối STOMP.
Bạn có thể tạo tệp ứng dụng khách trình duyệt trong src / main / resources / static / index.html như được minh họa -
<!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>
Hãy để chúng tôi tạo tệp app.js để sử dụng và tạo thông báo bằng cách sử dụng 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(); });
});
Mã cho ứng dụng Spring Boot chính được hiển thị bên dưới.
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);
}
}
Tệp cấu hình bản dựng hoàn chỉnh được cung cấp bên dưới.
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")
}
Bạn có thể tạo tệp JAR có thể thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng lệnh Maven hoặc Gradle như được hiển thị bên dưới:
Đối với Maven, bạn có thể sử dụng lệnh dưới đây:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, bạn có thể sử dụng lệnh như sau:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Chạy tệp JAR bằng cách sử dụng lệnh ở đây -
java –jar <JARFILE>
Bây giờ, ứng dụng đã khởi động trên cổng Tomcat 8080 như hình.
Bây giờ, hãy nhấn vào URL http://localhost:8080/ trong trình duyệt web của bạn và kết nối ổ cắm web và gửi lời chào và nhận tin nhắn.
Dịch vụ hàng loạt là một quá trình thực thi nhiều hơn một lệnh trong một tác vụ duy nhất. Trong chương này, bạn sẽ học cách tạo dịch vụ hàng loạt trong ứng dụng Spring Boot.
Chúng ta hãy xem xét một ví dụ mà chúng ta sẽ lưu nội dung tệp CSV vào HSQLDB.
Để tạo chương trình Batch Service, chúng ta cần thêm phần phụ thuộc Spring Boot Starter Batch và phần phụ thuộc HSQLDB vào tệp cấu hình bản dựng của chúng tôi.
Người dùng Maven có thể thêm các phần phụ thuộc sau vào tệp pom.xml.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
</dependency>
Người dùng Gradle có thể thêm các phần phụ thuộc sau vào tệp build.gradle.
compile("org.springframework.boot:spring-boot-starter-batch")
compile("org.hsqldb:hsqldb")
Bây giờ, hãy thêm tệp dữ liệu CSV đơn giản trong tài nguyên classpath - src / main / resources và đặt tên tệp là file.csv như được hiển thị -
William,John
Mike, Sebastian
Lawarance, Lime
Tiếp theo, viết một tập lệnh SQL cho HSQLDB - trong thư mục tài nguyên 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)
);
Tạo một lớp POJO cho mô hình USERS như minh họa -
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;
}
}
Bây giờ, hãy tạo một bộ xử lý trung gian để thực hiện các hoạt động sau khi đọc dữ liệu từ tệp CSV và trước khi ghi dữ liệu vào 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;
}
}
Hãy để chúng tôi tạo một tệp cấu hình hàng loạt, để đọc dữ liệu từ CSV và ghi vào tệp SQL như hình dưới đây. Chúng ta cần thêm chú thích @EnableBatchProcessing trong tệp lớp cấu hình. Chú thích @EnableBatchProcessing được sử dụng để kích hoạt các hoạt động hàng loạt cho ứng dụng Spring Boot của bạn.
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();
}
}
Các reader() phương thức được sử dụng để đọc dữ liệu từ tệp CSV và phương thức writer () được sử dụng để ghi dữ liệu vào SQL.
Tiếp theo, chúng ta sẽ phải viết một lớp Trình nghe Thông báo Hoàn thành Công việc - dùng để thông báo sau khi Hoàn thành Công việc.
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.");
}
}
}
}
Bây giờ, tạo một tệp JAR có thể thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng các lệnh Maven hoặc Gradle sau.
Đối với Maven, sử dụng lệnh như minh họa -
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, bạn có thể sử dụng lệnh như sau:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Chạy tệp JAR bằng cách sử dụng lệnh ở đây -
java –jar <JARFILE>
Bạn có thể thấy đầu ra trong cửa sổ giao diện điều khiển như được hiển thị:
Apache Kafka là một dự án mã nguồn mở được sử dụng để xuất bản và đăng ký các tin nhắn dựa trên hệ thống nhắn tin có khả năng chịu lỗi. Nó nhanh chóng, có thể mở rộng và phân phối theo thiết kế. Nếu bạn là người mới bắt đầu sử dụng Kafka hoặc muốn hiểu rõ hơn về nó, vui lòng tham khảo liên kết này - www.tutorialspoint.com/apache_kafka/
Trong chương này, chúng ta sẽ xem cách triển khai Apache Kafka trong ứng dụng Spring Boot.
Đầu tiên, chúng ta cần thêm phần phụ thuộc Spring Kafka vào tệp cấu hình bản dựng của mình.
Người dùng Maven có thể thêm phần phụ thuộc sau vào tệp pom.xml.
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
Người dùng Gradle có thể thêm phần phụ thuộc sau vào tệp build.gradle.
compile group: 'org.springframework.kafka', name: 'spring-kafka', version: '2.1.0.RELEASE'
Sản xuất thông điệp
Để tạo thông báo vào Apache Kafka, chúng ta cần xác định lớp Cấu hình cho cấu hình Producer như hình minh họa:
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());
}
}
Để xuất bản một tin nhắn, hãy tự động nối đối tượng Mẫu Kafka và tạo ra tin nhắn như được hiển thị.
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
public void sendMessage(String msg) {
kafkaTemplate.send(topicName, msg);
}
Tiêu thụ một tin nhắn
Để sử dụng các thông báo, chúng ta cần viết tệp lớp cấu hình Người tiêu dùng như được hiển thị bên dưới.
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;
}
}
Tiếp theo, viết một Listener để nghe tin nhắn.
@KafkaListener(topics = "tutorialspoint", groupId = "group-id")
public void listen(String message) {
System.out.println("Received Messasge in group - group-id: " + message);
}
Chúng ta hãy gọi phương thức sendMessage () từ phương thức chạy lớp ApplicationRunner từ tệp lớp ứng dụng Spring Boot chính và sử dụng thông báo từ cùng một tệp lớp.
Mã tệp lớp ứng dụng Spring Boot chính của bạn được cung cấp bên dưới:
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");
}
}
Mã cho tệp cấu hình bản dựng hoàn chỉnh được cung cấp bên dưới.
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')
}
Bây giờ, hãy tạo một tệp JAR có thể thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng các lệnh Maven hoặc Gradle bên dưới như được hiển thị:
Đối với Maven, sử dụng lệnh như minh họa -
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, sử dụng lệnh như minh họa -
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Chạy tệp JAR bằng cách sử dụng lệnh ở đây -
java –jar <JARFILE>
Bạn có thể thấy đầu ra trong cửa sổ giao diện điều khiển.
Twilio là ứng dụng của bên thứ 3 được sử dụng để gửi SMS và thực hiện cuộc gọi thoại từ ứng dụng của chúng tôi. Nó cho phép chúng tôi gửi SMS và thực hiện các cuộc gọi thoại theo chương trình.
Trong chương này, bạn sẽ tìm hiểu cách thực hiện gửi SMS và thực hiện cuộc gọi thoại bằng cách sử dụng Spring Boot với Twilio.
Note- Chúng tôi đã sử dụng tài khoản Trail trong Twilio để gửi SMS và thực hiện cuộc gọi thoại. Bạn có thể tìm hiểu thêm về Twilio tại www.twilio.com .
Đầu tiên, chúng ta cần thêm phần phụ thuộc Twilio vào tệp cấu hình bản dựng của mình.
Người dùng Maven có thể thêm phần phụ thuộc sau vào tệp pom.xml.
<dependency>
<groupId>com.twilio.sdk</groupId>
<artifactId>twilio</artifactId>
<version>7.16.1</version>
</dependency>
Người dùng Gradle có thể thêm phần phụ thuộc sau vào tệp build.gradle.
compile group: "com.twilio.sdk", name:"twilio", version: "7.16.1"
Bây giờ, khởi tạo tài khoản Twilio với ACCOUNT_SID và AUTH_ID trong khối tĩnh như được hiển thị -
static {
Twilio.init(ACCOUNT_SID, AUTH_ID);
}
Gửi SMS
Để gửi SMS, chúng tôi cần cung cấp từ-số và đến-số cho phương thức Message.create (). Nội dung nội dung thông báo cũng cần cung cấp cho phương thức Message.creator () như được hiển thị:
Message.creator(new PhoneNumber("to-number"), new PhoneNumber("from-number"),
"Message from Spring Boot Application").create();
Tệp lớp ứng dụng Spring Boot chính trông bên dưới.
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();
}
}
Mã hoàn chỉnh để tạo tệp cấu hình được cung cấp dưới đây:
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.+"
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng khởi động mùa xuân bằng cách sử dụng các lệnh Maven hoặc Gradle sau:
Đối với Maven, sử dụng lệnh như minh họa -
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, sử dụng lệnh như minh họa -
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Chạy tệp JAR bằng cách sử dụng lệnh như dưới đây:
java –jar <JARFILE>
Bây giờ, bạn sẽ nhận được tin nhắn SMS đến "số" của bạn.
Đã nhận được tin nhắn tới "tới số".
Sent from your Twilio trail account
- Message from Spring Boot Application
Note- Trong ví dụ này, chúng tôi đã sử dụng tài khoản Trail. Vì vậy, bạn nên xác minh các số trước khi gửi SMS.
Các cuộc gọi thoại
Để thực hiện cuộc gọi thoại bằng Twilio, chúng ta cần gọi phương thức Call.creator (). Đối với phương pháp này, chúng tôi cần cung cấp một số tới số, từ số và ghi chú thoại như được hiển thị ở đây.
Call.creator(new PhoneNumber("<to-number>"), new PhoneNumber("<from-number>"),
new URI("http://demo.twilio.com/docs/voice.xml")).create();
Mã cho tệp lớp ứng dụng Spring Boot chính được đưa ra bên dưới.
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();
}
}
Mã cho tệp cấu hình bản dựng hoàn chỉnh được cung cấp bên dưới:
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.+"
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng các lệnh Maven hoặc Gradle sau.
Đối với Maven, sử dụng lệnh như minh họa -
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, sử dụng lệnh như minh họa -
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, hãy chạy tệp JAR bằng cách sử dụng lệnh được cung cấp ở đây -
java –jar <JARFILE>
Bây giờ, bạn sẽ nhận được cuộc gọi đến "số" của bạn từ Twilio.
Nhấn phím bất kỳ sau khi tham gia cuộc gọi, bạn sẽ nghe thấy ghi chú giọng nói từ https://demo.twilio.com/docs/voice.xml
Note- Trong ví dụ này, chúng tôi đã sử dụng tài khoản Trail. Vì vậy, bạn nên xác minh các số trước khi thực hiện cuộc gọi.
Kiểm thử đơn vị là một trong những kiểm thử do các nhà phát triển thực hiện để đảm bảo các chức năng của đơn vị hoặc thành phần riêng lẻ đang hoạt động tốt.
Trong hướng dẫn này, chúng ta sẽ xem cách viết một unit test case bằng cách sử dụng Mockito và Web Controller.
Mockito
Để đưa Mockito Mocks vào Spring Beans, chúng ta cần thêm phần phụ thuộc Mockito-core vào tệp cấu hình xây dựng của chúng tôi.
Người dùng Maven có thể thêm phần phụ thuộc sau vào tệp pom.xml của bạn.
<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>
Người dùng Gradle có thể thêm phần phụ thuộc sau vào tệp build.gradle.
compile group: 'org.mockito', name: 'mockito-core', version: '2.13.0'
testCompile('org.springframework.boot:spring-boot-starter-test')
Mã để viết một lớp Dịch vụ có chứa một phương thức trả về giá trị Chuỗi được đưa ra ở đây.
package com.tutorialspoint.mockitodemo;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
public String getProductName() {
return "Honey";
}
}
Bây giờ, hãy đưa lớp ProductService vào một tệp lớp Dịch vụ khác như được hiển thị.
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();
}
}
Tệp lớp ứng dụng Spring Boot chính được cung cấp bên dưới:
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);
}
}
Sau đó, cấu hình ngữ cảnh Ứng dụng cho các bài kiểm tra. Chú thích @Profile (“test”) được sử dụng để định cấu hình lớp khi các trường hợp Kiểm tra đang chạy.
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);
}
}
Bây giờ, bạn có thể viết một Unit Test case cho Dịch vụ Đặt hàng trong src/test/resources gói hàng.
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);
}
}
Mã hoàn chỉnh cho tệp cấu hình bản dựng được cung cấp bên dưới.
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')
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng các lệnh Maven hoặc Gradle1 sau đây.
Đối với Maven, bạn có thể sử dụng lệnh như hình:
mvn clean install
Bạn có thể xem kết quả kiểm tra trong cửa sổ bảng điều khiển.
Đối với Gradle, bạn có thể sử dụng lệnh như sau:
gradle clean build
Bạn có thể xem kết quả còn lại trong cửa sổ bảng điều khiển.
Spring Boot cung cấp một cách dễ dàng để viết một tệp Unit Test cho Rest Controller. Với sự trợ giúp của SpringJUnit4ClassRunner và MockMvc, chúng ta có thể tạo ngữ cảnh ứng dụng web để viết tệp Unit Test cho Rest Controller.
Unit Test nên được viết dưới src/test/java tài nguyên thư mục và classpath để viết bài kiểm tra nên được đặt trong src/test/resources danh mục.
Để Viết một bài kiểm tra đơn vị, chúng tôi cần thêm phần phụ thuộc Kiểm tra khởi động mùa xuân vào tệp cấu hình bản dựng của bạn như được hiển thị bên dưới.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
Người dùng Gradle có thể thêm phần phụ thuộc sau vào tệp build.gradle của bạn.
testCompile('org.springframework.boot:spring-boot-starter-test')
Trước khi viết Test case, trước tiên chúng ta nên xây dựng các dịch vụ web RESTful. Để biết thêm thông tin về cách xây dựng các dịch vụ web RESTful, vui lòng tham khảo chương về cùng một trong hướng dẫn này.
Viết bài kiểm tra đơn vị cho bộ điều khiển REST
Trong phần này, chúng ta hãy xem cách viết Unit Test cho Bộ điều khiển REST.
Đầu tiên, chúng ta cần tạo tệp lớp Abstract dùng để tạo ngữ cảnh ứng dụng web bằng cách sử dụng MockMvc và xác định phương thức mapToJson () và mapFromJson () để chuyển đổi đối tượng Java thành chuỗi JSON và chuyển chuỗi JSON thành đối tượng 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);
}
}
Tiếp theo, viết tệp lớp mở rộng lớp AbstractTest và viết Bài kiểm tra đơn vị cho từng phương thức như GET, POST, PUT và DELETE.
Mã cho GET API Test case được cung cấp bên dưới. API này là để xem danh sách các sản phẩm.
@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);
}
Mã cho trường hợp thử nghiệm POST API được đưa ra bên dưới. API này là để tạo ra một sản phẩm.
@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");
}
Mã cho PUT API Test case được đưa ra bên dưới. API này là để cập nhật sản phẩm hiện có.
@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");
}
Mã cho Xóa trường hợp thử nghiệm API được cung cấp bên dưới. API này sẽ xóa sản phẩm hiện có.
@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");
}
Tệp lớp Kiểm tra Bộ điều khiển đầy đủ được cung cấp bên dưới:
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");
}
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng lệnh Maven hoặc Gradle được cung cấp bên dưới:
Đối với Maven, bạn có thể sử dụng lệnh dưới đây:
mvn clean install
Bây giờ, bạn có thể xem kết quả kiểm tra trong cửa sổ giao diện điều khiển.
Đối với Gradle, bạn có thể sử dụng lệnh như hình dưới đây:
gradle clean build
Bạn có thể xem kết quả còn lại trong cửa sổ giao diện điều khiển như hình dưới đây.
Spring Boot hỗ trợ rất tốt để tạo DataSource cho Database. Chúng ta không cần viết thêm bất kỳ mã nào để tạo một DataSource trong Spring Boot. Chỉ cần thêm các phần phụ thuộc và thực hiện chi tiết cấu hình là đủ để tạo Nguồn dữ liệu và kết nối Cơ sở dữ liệu.
Trong chương này, chúng ta sẽ sử dụng kết nối trình điều khiển Spring Boot JDBC để kết nối cơ sở dữ liệu.
Đầu tiên, chúng ta cần thêm phần phụ thuộc Spring Boot Starter JDBC vào tệp cấu hình xây dựng của chúng tôi.
Người dùng Maven có thể thêm các phần phụ thuộc sau vào tệp pom.xml.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
Người dùng Gradle có thể thêm các phần phụ thuộc sau vào tệp build.gradle.
compile('org.springframework.boot:spring-boot-starter-jdbc')
Kết nối với cơ sở dữ liệu H2
Để kết nối cơ sở dữ liệu H2, chúng ta cần thêm phần phụ thuộc cơ sở dữ liệu H2 vào tệp cấu hình bản dựng của chúng ta.
Đối với người dùng Maven, hãy thêm phần phụ thuộc bên dưới vào tệp pom.xml của bạn.
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
Đối với người dùng Gradle, hãy thêm phần phụ thuộc bên dưới vào tệp build.gradle của bạn.
compile('com.h2database:h2')
Chúng ta cần tạo tệp schema.sql và tệp data.sql trong thư mục classpath src / main / resources để kết nối cơ sở dữ liệu H2.
Tệp schema.sql được cung cấp bên dưới.
CREATE TABLE PRODUCT (ID INT PRIMARY KEY, PRODUCT_NAME VARCHAR(25));
Tệp data.sql được đưa ra bên dưới.
INSERT INTO PRODUCT (ID,PRODUCT_NAME) VALUES (1,'Honey');
INSERT INTO PRODUCT (ID,PRODUCT_NAME) VALUES (2,'Almond');
Kết nối MySQL
Để kết nối cơ sở dữ liệu MySQL, chúng ta cần thêm phần phụ thuộc MySQL vào tệp cấu hình xây dựng của chúng tôi.
Đối với người dùng Maven, hãy thêm phần phụ thuộc sau vào tệp pom.xml của bạn.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
Đối với người dùng Gradle, hãy thêm phần phụ thuộc sau vào tệp build.gradle của bạn.
compile('mysql:mysql-connector-java')
Bây giờ, tạo cơ sở dữ liệu và bảng trong MySQL như được hiển thị:
Đối với người dùng tệp thuộc tính, hãy thêm các thuộc tính sau vào tệp 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
Đối với người dùng YAML, hãy thêm các thuộc tính sau vào tệp 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
Kết nối Redis
Redis là một cơ sở dữ liệu mã nguồn mở được sử dụng để lưu trữ cấu trúc dữ liệu trong bộ nhớ. Để kết nối cơ sở dữ liệu Redis trong ứng dụng Spring Boot, chúng ta cần thêm phần phụ thuộc Redis vào tệp cấu hình bản dựng của mình.
Người dùng Maven nên thêm phần phụ thuộc sau vào tệp pom.xml của bạn.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
Người dùng Gradle nên thêm phần phụ thuộc sau vào tệp build.gradle của bạn.
compile('org.springframework.boot:spring-boot-starter-data-redis')
Đối với kết nối Redis, chúng ta cần sử dụng RedisTemplate. Đối với RedisTemplate, chúng tôi cần cung cấp thông tin chi tiết về 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;
}
Bây giờ tự động nối lớp RedisTemplate và truy cập dữ liệu từ cơ sở dữ liệu Redis.
@Autowired
RedisTemplate<String, Object> redis;
Map<Object,Object> datalist = redis.opsForHash().entries(“Redis_code_index_key”);
JDBCTemplate
Để truy cập Cơ sở dữ liệu quan hệ bằng cách sử dụng JdbcTemplate trong ứng dụng Spring Boot, chúng ta cần thêm phần phụ thuộc Spring Boot Starter JDBC vào tệp cấu hình bản dựng của chúng tôi.
Sau đó, nếu bạn @ Không mong muốn lớp JdbcTemplate, Spring Boot sẽ tự động kết nối Cơ sở dữ liệu và đặt Nguồn dữ liệu cho đối tượng JdbcTemplate.
@Autowired
JdbcTemplate jdbcTemplate;
Collection<Map<String, Object>> rows = jdbc.queryForList("SELECT QUERY");
Chú thích @Repository phải được thêm vào tệp lớp. Chú thích @Repository được sử dụng để tạo kho cơ sở dữ liệu cho ứng dụng Spring Boot của bạn.
@Repository
public class ProductServiceDAO {
}
Nhiều nguồn dữ liệu
Chúng ta có thể giữ các Nguồn dữ liệu số 'n' trong một ứng dụng Spring Boot. Ví dụ ở đây cho thấy cách tạo nhiều hơn 1 nguồn dữ liệu trong ứng dụng Spring Boot. Bây giờ, hãy thêm hai chi tiết cấu hình nguồn dữ liệu trong tệp thuộc tính ứng dụng.
Đối với người dùng tệp thuộc tính, hãy thêm các thuộc tính sau vào tệp application.properties của bạn.
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
Người dùng Yaml nên thêm các thuộc tính sau vào tệp application.yml của bạn.
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
Bây giờ, hãy tạo một lớp Cấu hình để tạo một DataSource và JdbcTemplate cho nhiều nguồn dữ liệu.
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);
}
}
Sau đó, tự động nối dây đối tượng JDBCTemplate bằng cách sử dụng chú thích @Qualifier.
@Qualifier("jdbcProductService")
@Autowired
JdbcTemplate jdbcTemplate;
@Qualifier("jdbcUserService")
@Autowired
JdbcTemplate jdbcTemplate;
Nếu phụ thuộc Spring Boot Security được thêm vào đường dẫn classpath, ứng dụng Spring Boot sẽ tự động yêu cầu Xác thực Cơ bản cho tất cả các Điểm cuối HTTP. Điểm cuối “/” và “/ home” không yêu cầu bất kỳ xác thực nào. Tất cả các Điểm cuối khác đều yêu cầu xác thực.
Để thêm Spring Boot Security vào ứng dụng Spring Boot của bạn, chúng tôi cần thêm phần phụ thuộc Spring Boot Starter Security vào tệp cấu hình bản dựng của chúng tôi.
Người dùng Maven có thể thêm phần phụ thuộc sau vào tệp pom.xml.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Người dùng Gradle có thể thêm phần phụ thuộc sau vào tệp build.gradle.
compile("org.springframework.boot:spring-boot-starter-security")
Bảo mật ứng dụng Web
Đầu tiên, tạo một ứng dụng web không an toàn bằng cách sử dụng các mẫu Thymeleaf.
Sau đó, tạo tệp home.html trong src/main/resources/templates danh mục.
<!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>
Quan điểm đơn giản /hello được xác định trong tệp HTML bằng cách sử dụng các mẫu Thymeleaf.
Bây giờ, hãy tạo một hello.html trong src/main/resources/templates danh mục.
<!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>
Bây giờ, chúng ta cần thiết lập Spring MVC - View controller cho home và hello.
Đối với điều này, hãy tạo tệp cấu hình MVC mở rộng 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");
}
}
Bây giờ, thêm phần phụ thuộc bảo mật Spring Boot Starter vào tệp cấu hình bản dựng của bạn.
Người dùng Maven có thể thêm phần phụ thuộc sau vào tệp pom.xml của bạn.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Người dùng Gradle có thể thêm phần phụ thuộc sau vào tệp build.gradle.
compile("org.springframework.boot:spring-boot-starter-security")
Bây giờ, hãy tạo một tệp Cấu hình Bảo mật Web, được sử dụng để bảo mật ứng dụng của bạn truy cập Điểm cuối HTTP bằng cách sử dụng xác thực cơ bản.
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");
}
}
Bây giờ, hãy tạo một tệp login.html trong src/main/resources để cho phép người dùng truy cập Điểm cuối HTTP thông qua màn hình đăng nhập.
<!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>
Cuối cùng, cập nhật tệp hello.html - để cho phép người dùng Đăng xuất khỏi ứng dụng và hiển thị tên người dùng hiện tại như hình dưới đây -
<!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>
Mã cho ứng dụng Spring Boot chính được cung cấp bên dưới:
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);
}
}
Mã hoàn chỉnh cho tệp cấu hình bản dựng được cung cấp bên dưới.
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')
}
Bây giờ, tạo một tệp JAR có thể thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng các lệnh Maven hoặc Gradle sau.
Người dùng Maven có thể sử dụng lệnh như dưới đây:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Người dùng Gradle có thể sử dụng lệnh như được hiển thị:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, chạy tệp JAR bằng cách sử dụng lệnh hiển thị bên dưới:
java –jar <JARFILE>
Nhấn vào URL http://localhost:8080/trong trình duyệt web của bạn. Bạn có thể thấy đầu ra như hình.
Trong chương này, bạn sẽ tìm hiểu chi tiết về cơ chế Spring Boot Security và OAuth2 với JWT.
Máy chủ ủy quyền
Máy chủ ủy quyền là một thành phần kiến trúc tối cao cho Bảo mật API Web. Máy chủ ủy quyền hoạt động một điểm ủy quyền tập trung cho phép các ứng dụng và điểm cuối HTTP của bạn xác định các tính năng của ứng dụng của bạn.
Máy chủ tài nguyên
Máy chủ tài nguyên là một ứng dụng cung cấp mã thông báo truy cập cho máy khách để truy cập Điểm cuối HTTP của Máy chủ tài nguyên. Nó là bộ sưu tập các thư viện chứa các Điểm cuối HTTP, tài nguyên tĩnh và các trang web Động.
OAuth2
OAuth2 là một khung ủy quyền cho phép ứng dụng Web Security truy cập các tài nguyên từ máy khách. Để xây dựng ứng dụng OAuth2, chúng ta cần tập trung vào Loại cấp quyền (Mã ủy quyền), ID ứng dụng khách và bí mật ứng dụng khách.
Mã thông báo JWT
Mã thông báo JWT là Mã thông báo web JSON, được sử dụng để đại diện cho các tuyên bố được bảo mật giữa hai bên. Bạn có thể tìm hiểu thêm về mã thông báo JWT tại www.jwt.io/ .
Bây giờ, chúng ta sẽ xây dựng một ứng dụng OAuth2 cho phép sử dụng Máy chủ ủy quyền, Máy chủ tài nguyên với sự trợ giúp của Mã thông báo JWT.
Bạn có thể sử dụng các bước sau để triển khai Spring Boot Security với mã thông báo JWT bằng cách truy cập cơ sở dữ liệu.
Đầu tiên, chúng ta cần thêm các phần phụ thuộc sau vào tệp cấu hình bản dựng của mình.
Người dùng Maven có thể thêm các phần phụ thuộc sau vào tệp pom.xml của bạn.
<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>
Người dùng Gradle có thể thêm các phần phụ thuộc sau vào tệp 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")
Ở đâu,
Spring Boot Starter Security - Thực hiện An ninh mùa xuân
Spring Security OAuth2 - Triển khai cấu trúc OAUTH2 để kích hoạt Máy chủ Ủy quyền và Máy chủ Tài nguyên.
Spring Security JWT - Tạo mã thông báo JWT để bảo mật web
Spring Boot Starter JDBC - Truy cập cơ sở dữ liệu để đảm bảo người dùng có sẵn sàng hay không.
Spring Boot Starter Web - Viết các điểm cuối HTTP.
H2 Database - Lưu trữ thông tin người dùng để xác thực và ủy quyền.
Tệp cấu hình bản dựng hoàn chỉnh được cung cấp bên dưới.
<?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")
}
Bây giờ, trong ứng dụng Spring Boot chính, hãy thêm chú thích @EnableAuthorizationServer và @EnableResourceServer để hoạt động như một máy chủ Auth và Máy chủ tài nguyên trong cùng một ứng dụng.
Ngoài ra, bạn có thể sử dụng mã sau để viết một điểm cuối HTTP đơn giản để truy cập API với Spring Security bằng cách sử dụng JWT Token.
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";
}
}
Sử dụng mã sau để xác định lớp POJO để lưu trữ thông tin Người dùng để xác thực.
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;
}
}
Bây giờ, sử dụng đoạn mã sau và xác định lớp CustomUser mở rộng lớp org.springframework.security.core.userdetails.User để xác thực 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());
}
}
Bạn có thể tạo lớp @Repository để đọc thông tin Người dùng từ cơ sở dữ liệu và gửi nó đến Dịch vụ người dùng tùy chỉnh, đồng thời thêm quyền được cấp “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;
}
}
Bạn có thể tạo lớp dịch vụ chi tiết Người dùng tùy chỉnh mở rộng org.springframework.security.core.userdetails.UserDetailsService để gọi lớp kho lưu trữ DAO như được hiển thị.
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");
}
}
}
Tiếp theo, tạo một lớp @configuration để kích hoạt Bảo mật Web, xác định bộ mã hóa Mật khẩu (BCryptPasswordEncoder) và xác định bean AuthenticationManager. Lớp cấu hình bảo mật nên mở rộng lớp 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();
}
}
Bây giờ, hãy xác định lớp Cấu hình OAuth2 để thêm Client ID, Client Secret, Xác định JwtAccessTokenConverter, Private key và Public key cho khóa người ký mã thông báo và khóa xác minh, và định cấu hình ClientDetailsServiceConfigurer để có hiệu lực Mã thông báo với phạm vi.
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);
}
}
Bây giờ, hãy tạo khóa riêng và khóa công khai bằng cách sử dụng openssl.
Bạn có thể sử dụng các lệnh sau để tạo khóa cá nhân.
openssl genrsa -out jwt.pem 2048
openssl rsa -in jwt.pem
Bạn có thể sử dụng Để tạo khóa công khai, hãy sử dụng các lệnh dưới đây.
openssl rsa -in jwt.pem -pubout
Đối với phiên bản Spring Boot sau bản phát hành 1.5, hãy thêm thuộc tính dưới đây vào tệp application.properties của bạn để xác định thứ tự bộ lọc Tài nguyên OAuth2.
security.oauth2.resource.filter-order=3
Người dùng tệp YAML có thể thêm thuộc tính dưới đây vào tệp YAML.
security:
oauth2:
resource:
filter-order: 3
Bây giờ, tạo tệp schema.sql và data.sql trong tài nguyên classpath src/main/resources/directory để kết nối ứng dụng với cơ sở dữ liệu H2.
Tệp schema.sql như được hiển thị:
CREATE TABLE USERS (ID INT PRIMARY KEY, USERNAME VARCHAR(45), PASSWORD VARCHAR(60));
Tệp data.sql như được hiển thị:
INSERT INTO USERS (ID, USERNAME,PASSWORD) VALUES (
1, '[email protected]','$2a$08$fL7u5xcvsZl78su29x1ti.dxI.9rYO8t0q5wk2ROJ.1cdR53bmaVG'); INSERT INTO USERS (ID, USERNAME,PASSWORD) VALUES ( 2, '[email protected]','$2a$08$fL7u5xcvsZl78su29x1ti.dxI.9rYO8t0q5wk2ROJ.1cdR53bmaVG');
Note - Mật khẩu nên được lưu trữ ở định dạng Bcrypt Encoder trong bảng cơ sở dữ liệu.
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng các lệnh Maven hoặc Gradle sau.
Đối với Maven, bạn có thể sử dụng lệnh dưới đây:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, bạn có thể sử dụng lệnh như sau:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, chạy tệp JAR bằng cách sử dụng lệnh hiển thị ở đây -
java –jar <JARFILE>
Ứng dụng được khởi động trên cổng Tomcat 8080.
Bây giờ, hãy nhấn vào URL của phương thức POST qua POSTMAN để nhận mã thông báo OAUTH2.
http://localhost:8080/oauth/token
Bây giờ, hãy thêm Tiêu đề Yêu cầu như sau:
Authorization - Xác thực cơ bản với Id khách hàng và bí mật khách hàng của bạn.
Content Type - application / x-www-form-urlencoded
Bây giờ, thêm các Tham số Yêu cầu như sau:
- Grant_type = mật khẩu
- tên người dùng = tên người dùng của bạn
- password = mật khẩu của bạn
Bây giờ, hãy nhấn vào API và nhận access_token như được hiển thị -
Bây giờ, Truy cập API máy chủ tài nguyên với mã truy cập Bearer trong Tiêu đề yêu cầu như được hiển thị.
Sau đó, bạn có thể thấy kết quả như hình dưới đây:
Google Cloud Platform cung cấp dịch vụ điện toán đám mây chạy ứng dụng Spring Boot trong môi trường đám mây. Trong chương này, chúng ta sẽ xem cách triển khai ứng dụng Spring Boot trong nền tảng công cụ ứng dụng GCP.
Đầu tiên, tải xuống ứng dụng Gradle build Spring Boot từ trang Spring Initializer www.start.spring.io . Quan sát ảnh chụp màn hình sau.
Bây giờ, trong tệp build.gradle, hãy thêm plugin Google Cloud appengine và sự phụ thuộc của appengine classpath.
Mã cho tệp build.gradle được cung cấp bên dưới:
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')
}
Bây giờ, hãy viết một Điểm cuối HTTP đơn giản và nó trả về chuỗi thành công như được hiển thị:
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";
}
}
Tiếp theo, thêm tệp app.yml vào thư mục src / main / appengine như hình -
runtime: java
env: flex
handlers:
- url: /.*
script: this field is required, but ignored
Bây giờ, hãy chuyển đến bảng điều khiển Google Cloud và nhấp vào kích hoạt Google cloud shell ở đầu trang.
Bây giờ, hãy di chuyển tệp nguồn và tệp Gradle của bạn vào thư mục chính của máy đám mây google của bạn bằng cách sử dụng google cloud shell.
Bây giờ, hãy thực thi lệnh gradle appengineDeploy và nó sẽ triển khai ứng dụng của bạn vào ứng dụng Google Cloud.
Note - GCP phải được bật tính năng thanh toán và trước khi triển khai ứng dụng của bạn vào appengine, bạn nên tạo nền tảng appengine trong GCP.
Sẽ mất vài phút để triển khai ứng dụng của bạn vào nền tảng ứng dụng GCP.
Sau khi xây dựng thành công, bạn có thể thấy URL dịch vụ trong cửa sổ bảng điều khiển.
Bây giờ, hãy nhấn vào URL dịch vụ và xem kết quả.
Google Cloud SQL
Để kết nối Google Cloud SQL với ứng dụng Spring Boot của bạn, bạn nên thêm các thuộc tính sau vào tệp application.properties của mình.
Định dạng URL JDBC
jdbc:mysql://google/<DATABASE-NAME>?cloudSqlInstance = <GOOGLE_CLOUD_SQL_INSTANCE_NAME> &socketFactory = com.google.cloud.sql.mysql.SocketFactory&user = <USERNAME>&password = <PASSWORD>
Note - Ứng dụng Spring Boot và Google Cloud SQL phải nằm trong cùng một dự án GCP.
Tệp application.properties được cung cấp bên dưới.
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
Người dùng tệp YAML có thể thêm các thuộc tính dưới đây vào tệp application.yml của bạn.
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
Trong chương này, chúng ta sẽ xem cách thêm Đăng nhập Google OAuth2 bằng cách sử dụng ứng dụng Spring Boot với bản dựng Gradle.
Đầu tiên, thêm phần phụ thuộc bảo mật Spring Boot OAuth2 vào tệp cấu hình bản dựng của bạn và tệp cấu hình bản dựng của bạn được cung cấp bên dưới.
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')
}
Bây giờ, hãy thêm Điểm cuối HTTP để đọc Hiệu trưởng người dùng từ Google sau khi xác thực qua Spring Boot trong tệp lớp ứng dụng Spring Boot chính như được cung cấp bên dưới -
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;
}
}
Bây giờ, hãy viết tệp Cấu hình để bật OAuth2SSO cho bảo mật web và xóa xác thực cho tệp index.html như được minh họa -
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();
}
}
Tiếp theo, thêm tệp index.html bên dưới tài nguyên tĩnh và thêm liên kết để chuyển hướng đến Điểm cuối HTTP của người dùng để đọc Chính của người dùng Google như được hiển thị bên dưới -
<!DOCTYPE html>
<html>
<head>
<meta charset = "ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<a href = "user">Click here to Google Login</a>
</body>
</html>
Note - Trong bảng điều khiển Google Cloud - Bật Dịch vụ Gmail, Dịch vụ Analytics và (các) API dịch vụ Google+.
Sau đó, chuyển đến phần Thông tin xác thực và tạo thông tin xác thực và chọn ID ứng dụng khách OAuth.
Tiếp theo, cung cấp Tên sản phẩm trong màn hình chấp thuận OAuth2.
Tiếp theo, chọn Loại ứng dụng là “Ứng dụng web”, cung cấp nguồn gốc JavaScript được ủy quyền và URI chuyển hướng được ủy quyền.
Bây giờ, Mã ứng dụng khách OAuth2 và Bí mật ứng dụng khách của bạn đã được tạo.
Tiếp theo, thêm Mã ứng dụng khách và Bí mật ứng dụng khách trong tệp thuộc tính ứng dụng của bạn.
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
Bây giờ, bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng lệnh Gradle sau.
Đối với Gradle, bạn có thể sử dụng lệnh như sau:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Chạy tệp JAR bằng cách sử dụng lệnh java –jar <JARFILE> và ứng dụng được khởi động trên cổng Tomcat 8080.
Bây giờ hãy nhấn vào URL http://localhost:8080/ và nhấp vào liên kết Đăng nhập Google.
Nó sẽ chuyển hướng đến màn hình đăng nhập Google và cung cấp chi tiết đăng nhập Gmail.
Nếu đăng nhập thành công, chúng tôi sẽ nhận được đối tượng Chính của người dùng Gmail.