Spring Boot - Panduan Cepat

Spring Boot adalah kerangka kerja berbasis Java open source yang digunakan untuk membuat Layanan mikro. Ini dikembangkan oleh Pivotal Team dan digunakan untuk membangun aplikasi pegas yang berdiri sendiri dan siap produksi. Bab ini akan memberi Anda pengenalan tentang Spring Boot dan membiasakan Anda dengan konsep dasarnya.

Apa itu Layanan Mikro?

Layanan Mikro adalah arsitektur yang memungkinkan pengembang untuk mengembangkan dan menyebarkan layanan secara mandiri. Setiap layanan yang berjalan memiliki prosesnya sendiri dan ini mencapai model yang ringan untuk mendukung aplikasi bisnis.

Keuntungan

Layanan mikro menawarkan keuntungan berikut kepada para pengembangnya -

  • Penerapan mudah
  • Skalabilitas sederhana
  • Kompatibel dengan Container
  • Konfigurasi minimum
  • Waktu produksi lebih singkat

Apa itu Spring Boot?

Spring Boot menyediakan platform yang baik bagi pengembang Java untuk mengembangkan aplikasi pegas tingkat produksi dan mandiri yang Anda bisa just run. Anda dapat memulai dengan konfigurasi minimum tanpa perlu seluruh penyiapan konfigurasi Spring.

Keuntungan

Spring Boot menawarkan keuntungan berikut kepada para pengembangnya -

  • Mudah untuk memahami dan mengembangkan aplikasi pegas
  • Meningkatkan produktivitas
  • Mengurangi waktu pengembangan

Tujuan

Spring Boot dirancang dengan tujuan berikut -

  • Untuk menghindari konfigurasi XML yang kompleks di Spring
  • Untuk mengembangkan aplikasi Spring siap produksi dengan cara yang lebih mudah
  • Untuk mengurangi waktu pengembangan dan menjalankan aplikasi secara mandiri
  • Tawarkan cara yang lebih mudah untuk memulai aplikasi

Mengapa Spring Boot?

Anda dapat memilih Spring Boot karena fitur dan manfaat yang ditawarkannya seperti yang diberikan di sini -

  • Ini menyediakan cara yang fleksibel untuk mengonfigurasi Java Beans, konfigurasi XML, dan Transaksi Database.

  • Ini menyediakan pemrosesan batch yang kuat dan mengelola titik akhir REST.

  • Di Spring Boot, semuanya dikonfigurasi secara otomatis; tidak diperlukan konfigurasi manual.

  • Ini menawarkan aplikasi pegas berbasis anotasi

  • Memudahkan manajemen ketergantungan

  • Ini termasuk Kontainer Servlet Tertanam

Bagaimana cara kerjanya?

Spring Boot secara otomatis mengkonfigurasi aplikasi Anda berdasarkan dependensi yang telah Anda tambahkan ke proyek dengan menggunakan @EnableAutoConfigurationanotasi. Misalnya, jika database MySQL ada di classpath Anda, tetapi Anda belum mengonfigurasi koneksi database apa pun, Spring Boot otomatis mengonfigurasi database dalam memori.

Titik masuk aplikasi boot musim semi adalah yang dikandung kelas @SpringBootApplication anotasi dan metode utama.

Spring Boot secara otomatis memindai semua komponen yang disertakan dalam proyek dengan menggunakan @ComponentScan anotasi.

Pemula Boot Musim Semi

Menangani manajemen ketergantungan adalah tugas yang sulit untuk proyek besar. Spring Boot menyelesaikan masalah ini dengan menyediakan sekumpulan dependensi untuk kenyamanan pengembang.

Misalnya, jika Anda ingin menggunakan Spring dan JPA untuk akses database, cukup jika Anda menyertakan spring-boot-starter-data-jpa ketergantungan dalam proyek Anda.

Perhatikan bahwa semua pemula Spring Boot mengikuti pola penamaan yang sama spring-boot-starter- *, di mana * menunjukkan bahwa ini adalah jenis aplikasi.

Contoh

Lihatlah permulaan Spring Boot berikut yang dijelaskan di bawah ini untuk pemahaman yang lebih baik -

Spring Boot Starter Actuator dependencydigunakan untuk memantau dan mengelola aplikasi Anda. Kodenya ditunjukkan di bawah ini -

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

Spring Boot Starter Security dependencydigunakan untuk Keamanan Musim Semi. Kodenya ditunjukkan di bawah ini -

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

Spring Boot Starter web dependencydigunakan untuk menulis Titik Akhir Istirahat. Kodenya ditunjukkan di bawah ini -

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

Spring Boot Starter Thyme Leaf dependencydigunakan untuk membuat aplikasi web. Kodenya ditunjukkan di bawah ini -

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

Spring Boot Starter Test dependencydigunakan untuk menulis kasus Uji. Kodenya ditunjukkan di bawah ini -

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

Konfigurasi Otomatis

Spring Boot Auto Configuration secara otomatis mengkonfigurasi aplikasi Spring Anda berdasarkan dependensi JAR yang Anda tambahkan dalam proyek. Misalnya, jika database MySQL ada di jalur kelas Anda, tetapi Anda belum mengonfigurasi koneksi database apa pun, Spring Boot otomatis mengonfigurasi database dalam memori.

Untuk tujuan ini, Anda perlu menambahkan @EnableAutoConfiguration anotasi atau @SpringBootApplicationanotasi ke file kelas utama Anda. Kemudian, aplikasi Spring Boot Anda akan dikonfigurasi secara otomatis.

Perhatikan kode berikut untuk pemahaman yang lebih baik -

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

Aplikasi Spring Boot

Titik masuk dari Aplikasi Spring Boot adalah kelas berisi @SpringBootApplicationanotasi. Kelas ini harus memiliki metode utama untuk menjalankan aplikasi Spring Boot.@SpringBootApplication penjelasan mencakup Konfigurasi Otomatis, Pemindaian Komponen, dan Konfigurasi Spring Boot.

Jika Anda menambahkan @SpringBootApplication anotasi ke kelas, Anda tidak perlu menambahkan @EnableAutoConfiguration, @ComponentScan dan @SpringBootConfigurationanotasi. Itu@SpringBootApplication anotasi mencakup semua anotasi lainnya.

Perhatikan kode berikut untuk pemahaman yang lebih baik -

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

Pemindaian Komponen

Aplikasi Spring Boot memindai semua bean dan deklarasi paket saat aplikasi diinisialisasi. Anda perlu menambahkan@ComponentScan penjelasan untuk file kelas Anda untuk memindai komponen yang ditambahkan dalam proyek Anda.

Perhatikan kode berikut untuk pemahaman yang lebih baik -

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

Bab ini akan mengajarkan Anda cara membuat aplikasi Spring Boot menggunakan Maven dan Gradle.

Prasyarat

Sistem Anda harus memiliki persyaratan minimum berikut untuk membuat aplikasi Spring Boot -

  • Jawa 7
  • Maven 3.2.0
  • Gradle 2.5

CLI Sepatu Musim Semi

Spring Boot CLI adalah alat baris perintah dan memungkinkan kita menjalankan skrip Groovy. Ini adalah cara termudah untuk membuat aplikasi Spring Boot dengan menggunakan Antarmuka Baris Perintah Spring Boot. Anda dapat membuat, menjalankan, dan menguji aplikasi di command prompt itu sendiri.

Bagian ini menjelaskan langkah-langkah yang terlibat dalam penginstalan manual Spring Boot CLI. Untuk bantuan lebih lanjut, Anda dapat menggunakan tautan berikut:https://docs.spring.io/springboot/ docs/current-SNAPSHOT/reference/htmlsingle/#getting-started-installing-springboot

Anda juga dapat mengunduh distribusi Spring CLI dari gudang Spring Software di: https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#getting-started-manual-cli-installation

Untuk instalasi manual, Anda perlu menggunakan dua folder berikut -

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

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

Setelah mengunduh, buka file arsip dan ikuti langkah-langkah yang diberikan dalam file install.txt. Bukan berarti tidak memerlukan pengaturan lingkungan apa pun.

Di Windows, buka CLI Spring Boot bin direktori di command prompt dan jalankan perintah spring –-versionuntuk memastikan pegas CLI dipasang dengan benar. Setelah menjalankan perintah, Anda dapat melihat versi CLI pegas seperti yang ditunjukkan di bawah ini -

Jalankan Hello World dengan Groovy

Buat file groovy sederhana yang berisi skrip Rest Endpoint dan jalankan file groovy dengan CLI boot musim semi. Perhatikan kode yang ditampilkan di sini untuk tujuan ini -

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

Sekarang, simpan file asyik dengan nama hello.groovy. Perhatikan bahwa dalam contoh ini, kami menyimpan file keren di dalam Spring Boot CLIbindirektori. Sekarang jalankan aplikasi dengan menggunakan perintahspring run hello.groovy seperti yang ditunjukkan pada gambar yang diberikan di bawah ini -

Setelah Anda menjalankan file groovy, dependensi yang diperlukan akan diunduh secara otomatis dan itu akan memulai aplikasi di port Tomcat 8080 seperti yang ditunjukkan pada gambar yang diberikan di bawah ini -

Setelah Tomcat mulai, buka browser web dan tekan URL http://localhost:8080/ dan Anda dapat melihat hasilnya seperti yang ditunjukkan.

Bab ini akan menjelaskan kepada Anda bagaimana melakukan bootstrap pada aplikasi Spring Boot.

Penginisialisasi Musim Semi

Salah satu cara untuk melakukan Bootstrap pada aplikasi Spring Boot adalah dengan menggunakan Spring Initializer. Untuk melakukan ini, Anda harus mengunjungi halaman web Spring Initializer www.start.spring.io dan memilih Build, Spring Boot Version dan platform Anda. Selain itu, Anda perlu menyediakan Grup, Artefak, dan dependensi yang diperlukan untuk menjalankan aplikasi.

Amati tangkapan layar berikut yang menunjukkan contoh tempat kami menambahkan spring-boot-starter-web ketergantungan untuk menulis REST Endpoints.

Setelah Anda memberikan Grup, Artefak, Dependensi, Proyek Bangun, Platform dan Versi, klik Generate Projecttombol. File zip akan diunduh dan file akan diekstraksi.

Bagian ini menjelaskan contoh menggunakan Maven dan Gradle.

Maven

Setelah Anda mengunduh proyek, buka zip file tersebut. Sekarang, milikmupom.xml file terlihat seperti yang ditunjukkan di bawah ini -

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

Setelah Anda mengunduh proyek, buka zip file tersebut. Sekarang milik Andabuild.gradle file terlihat seperti yang ditunjukkan di bawah ini -

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

Ketergantungan Jalur Kelas

Spring Boot menyediakan sejumlah Startersuntuk menambahkan toples di jalur kelas kita. Misalnya, untuk menulis Rest Endpoint, kita perlu menambahkanspring-boot-starter-webketergantungan di jalur kelas kita. Amati kode yang ditunjukkan di bawah ini untuk pemahaman yang lebih baik -

Ketergantungan Maven

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

Ketergantungan Gradle

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

Metode Utama

Metode utama harus menulis kelas Aplikasi Spring Boot. Kelas ini harus diberi anotasi@SpringBootApplication. Ini adalah titik masuk aplikasi boot musim semi untuk memulai. Anda dapat menemukan file kelas utama di bawahsrc/java/main direktori dengan paket default.

Dalam contoh ini, file kelas utama terletak di src/java/main direktori dengan paket default com.tutorialspoint.demo. Perhatikan kode yang ditampilkan di sini untuk pemahaman yang lebih baik -

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

Tulis Titik Akhir Istirahat

Untuk menulis Titik Akhir Istirahat Hello World sederhana di file kelas utama Aplikasi Spring Boot itu sendiri, ikuti langkah-langkah yang ditunjukkan di bawah ini -

  • Pertama, tambahkan @RestController anotasi di bagian atas kelas.

  • Sekarang, tulis metode URI Permintaan dengan @RequestMapping anotasi.

  • Kemudian, metode URI Permintaan harus mengembalikan Hello World tali.

Sekarang, file kelas Aplikasi Spring Boot utama Anda akan terlihat seperti yang ditunjukkan pada kode yang diberikan di bawah ini -

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

Buat JAR yang Dapat Dieksekusi

Mari kita buat file JAR yang dapat dieksekusi untuk menjalankan aplikasi Spring Boot dengan menggunakan perintah Maven dan Gradle di command prompt seperti yang ditunjukkan di bawah ini -

Gunakan perintah Maven mvn clean install seperti yang ditunjukkan di bawah ini -

Setelah menjalankan perintah, Anda dapat melihat file BUILD SUCCESS pesan di command prompt seperti yang ditunjukkan di bawah ini -

Gunakan perintah Gradle gradle clean build seperti yang ditunjukkan di bawah ini -

Setelah menjalankan perintah, Anda dapat melihat file BUILD SUCCESSFUL pesan di command prompt seperti yang ditunjukkan di bawah ini -

Jalankan Hello World dengan Java

Setelah Anda membuat file JAR yang dapat dieksekusi, Anda dapat menemukannya di bawah direktori berikut.

Untuk Maven, Anda dapat menemukan file JAR di bawah direktori target seperti yang ditunjukkan di bawah ini -

Untuk Gradle, Anda dapat menemukan file JAR di bawah build/libs direktori seperti yang ditunjukkan di bawah ini -

Sekarang, jalankan file JAR dengan menggunakan perintah java –jar <JARFILE>. Perhatikan bahwa dalam contoh di atas, file JAR diberi namademo-0.0.1-SNAPSHOT.jar

Setelah Anda menjalankan file jar, Anda dapat melihat hasilnya di jendela konsol seperti yang ditunjukkan di bawah ini -

Sekarang, lihat konsolnya, Tomcat dimulai pada port 8080 (http). Sekarang, buka browser web dan tekan URLhttp://localhost:8080/ dan Anda dapat melihat hasilnya seperti yang ditunjukkan di bawah ini -

Dengan menggunakan aplikasi Spring Boot, kita dapat membuat file perang untuk disebarkan ke web server. Dalam bab ini, Anda akan mempelajari cara membuat file WAR dan menerapkan aplikasi Spring Boot di server web Tomcat.

Spring Boot Servlet Initializer

Cara penyebaran tradisional membuat Aplikasi Spring Boot @SpringBootApplication kelas memperpanjang SpringBootServletInitializerkelas. File kelas Spring Boot Servlet Initializer memungkinkan Anda untuk mengkonfigurasi aplikasi saat diluncurkan dengan menggunakan Servlet Container.

Kode untuk file kelas Aplikasi Spring Boot untuk penyebaran file JAR diberikan di bawah ini -

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

Kita perlu memperluas kelas SpringBootServletInitializeruntuk mendukung penyebaran file WAR. Kode file kelas Aplikasi Spring Boot diberikan di bawah ini -

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

Mengatur Kelas Utama

Di Spring Boot, kita perlu menyebutkan kelas utama yang harus dimulai di file build. Untuk tujuan ini, Anda dapat menggunakan potongan kode berikut -

Untuk Maven, tambahkan kelas awal di pom.xml properti seperti yang ditunjukkan di bawah ini -

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

Untuk Gradle, tambahkan nama kelas utama di build.gradle seperti yang ditunjukkan di bawah ini -

mainClassName="com.tutorialspoint.demo.DemoApplication"

Perbarui kemasan JAR menjadi WAR

Kami harus memperbarui kemasan JAR menjadi WAR menggunakan potongan kode berikut -

Untuk Maven, tambahkan kemasan sebagai WAR in pom.xml seperti yang ditunjukkan di bawah ini -

<packaging>war</packaging>

Untuk Gradle, tambahkan plugin aplikasi dan plugin perang di file build.gradle seperti yang ditunjukkan di bawah ini -

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

Sekarang, mari kita tulis Rest Endpoint sederhana untuk mengembalikan string "Hello World from Tomcat". Untuk menulis Rest Endpoint, kita perlu menambahkan ketergantungan web starter Spring Boot ke dalam file build kita.

Untuk Maven, tambahkan dependensi starter Spring Boot di pom.xml menggunakan kode seperti yang ditunjukkan di bawah ini -

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

Untuk Gradle, tambahkan dependensi starter Spring Boot di build.gradle menggunakan kode seperti yang ditunjukkan di bawah ini -

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

Sekarang, tulis Rest Endpoint sederhana di file kelas Aplikasi Spring Boot menggunakan kode seperti yang ditunjukkan di bawah ini -

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

Kemas Aplikasi Anda

Sekarang, buat file WAR untuk diterapkan ke server Tomcat dengan menggunakan perintah Maven dan Gradle untuk memaketkan aplikasi Anda seperti yang diberikan di bawah ini -

Untuk Maven, gunakan perintah mvn packageuntuk mengemas aplikasi Anda. Kemudian, file WAR akan dibuat dan Anda dapat menemukannya di direktori target seperti yang ditunjukkan pada tangkapan layar yang diberikan di bawah ini -

Untuk Gradle, gunakan perintah gradle clean builduntuk mengemas aplikasi Anda. Kemudian, file WAR Anda akan dibuat dan Anda dapat menemukannya di bawahbuild/libsdirektori. Amati tangkapan layar yang diberikan di sini untuk pemahaman yang lebih baik -

Terapkan ke Tomcat

Sekarang, jalankan Server Tomcat, dan terapkan file WAR di bawah webappsdirektori. Amati tangkapan layar yang ditampilkan di sini untuk pemahaman yang lebih baik -

Setelah penerapan berhasil, tekan URL di browser web Anda http://localhost:8080/demo-0.0.1-SNAPSHOT/ dan amati bahwa hasilnya akan terlihat seperti yang ditunjukkan pada gambar di bawah ini -

Kode lengkap untuk tujuan ini diberikan di bawah ini.

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

Kode untuk file kelas aplikasi Spring Boot utama diberikan di bawah ini -

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

Di Spring Boot, memilih sistem build adalah tugas penting. Kami merekomendasikan Maven atau Gradle karena mereka memberikan dukungan yang baik untuk manajemen dependensi. Spring tidak mendukung sistem build lain dengan baik.

Manajemen Ketergantungan

Tim Spring Boot memberikan daftar dependensi untuk mendukung versi Spring Boot untuk setiap rilisnya. Anda tidak perlu memberikan versi untuk dependensi dalam file konfigurasi build. Spring Boot secara otomatis mengkonfigurasi versi dependensi berdasarkan rilis. Ingatlah bahwa saat Anda mengupgrade versi Spring Boot, dependensi juga akan diupgrade secara otomatis.

Note- Jika Anda ingin menentukan versi untuk ketergantungan, Anda dapat menentukannya di file konfigurasi Anda. Namun, tim Spring Boot sangat menganjurkan bahwa tidak perlu menentukan versi untuk ketergantungan.

Ketergantungan Maven

Untuk konfigurasi Maven, kita harus mewarisi proyek induk Spring Boot Starter untuk mengelola dependensi Spring Boot Starters. Untuk ini, cukup kita dapat mewarisi induk awal di filepom.xml file seperti yang ditunjukkan di bawah ini.

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

Kita harus menentukan nomor versi untuk ketergantungan Spring Boot Parent Starter. Kemudian untuk dependensi starter lainnya, kita tidak perlu menentukan nomor versi Spring Boot. Perhatikan kode yang diberikan di bawah ini -

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

Ketergantungan Gradle

Kita dapat mengimpor dependensi Spring Boot Starters langsung ke build.gradlemengajukan. Kita tidak membutuhkan ketergantungan Spring Boot untuk Parent seperti Maven untuk Gradle. Perhatikan kode yang diberikan di bawah ini -

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

Demikian pula, di Gradle, kita tidak perlu menentukan nomor versi Spring Boot untuk dependensi. Spring Boot secara otomatis mengkonfigurasi ketergantungan berdasarkan versinya.

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

Spring Boot tidak memiliki tata letak kode untuk digunakan. Namun, ada beberapa praktik terbaik yang akan membantu kami. Bab ini membahasnya secara rinci.

Paket default

Kelas yang tidak memiliki deklarasi paket apa pun dianggap sebagai a default package. Perhatikan bahwa umumnya deklarasi paket default tidak direkomendasikan. Spring Boot akan menyebabkan masalah seperti kegagalan fungsi Konfigurasi Otomatis atau Pemindaian Komponen, saat Anda menggunakan paket default.

Note- Konvensi penamaan yang direkomendasikan Java untuk deklarasi paket adalah nama domain yang dibalik. Misalnya -com.tutorialspoint.myproject

Tata Letak Khas

Tata letak khas aplikasi Spring Boot ditunjukkan pada gambar yang diberikan di bawah ini -

File Application.java harus mendeklarasikan metode utama bersama dengan @SpringBootApplication. Perhatikan kode yang diberikan di bawah ini untuk pemahaman yang lebih baik -

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

Di Spring Boot, kita dapat menggunakan Spring Framework untuk menentukan kacang kita dan injeksi ketergantungannya. Itu@ComponentScan penjelasan digunakan untuk menemukan kacang dan yang sesuai dengan yang diinjeksi @Autowired anotasi.

Jika Anda mengikuti tata letak khas Spring Boot, tidak perlu menentukan argumen apa pun untuk @ComponentScananotasi. Semua file kelas komponen secara otomatis terdaftar dengan Spring Beans.

Contoh berikut memberikan ide tentang Auto wiring objek Rest Template dan membuat Bean untuk hal yang sama -

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

Kode berikut menunjukkan kode untuk objek Template Istirahat kabel otomatis dan objek pembuatan Bean di file kelas Aplikasi Spring Boot utama -

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

Antarmuka Application Runner dan Command Line Runner memungkinkan Anda untuk menjalankan kode setelah aplikasi Spring Boot dimulai. Anda dapat menggunakan antarmuka ini untuk melakukan tindakan apa pun segera setelah aplikasi dimulai. Bab ini membahasnya secara rinci.

Pelari Aplikasi

Application Runner adalah antarmuka yang digunakan untuk menjalankan kode setelah aplikasi Spring Boot dimulai. Contoh yang diberikan di bawah ini menunjukkan cara mengimplementasikan antarmuka Application Runner pada file kelas utama.

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

Sekarang, jika Anda mengamati jendela konsol di bawah ini Hello World from Application Runner, pernyataan println dijalankan setelah Tomcat dijalankan. Apakah tangkapan layar berikut relevan?

Pelari Baris Perintah

Command Line Runner adalah sebuah antarmuka. Ini digunakan untuk mengeksekusi kode setelah aplikasi Spring Boot dimulai. Contoh yang diberikan di bawah ini menunjukkan bagaimana mengimplementasikan antarmuka Command Line Runner pada file kelas utama.

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

Lihat jendela konsol di bawah pernyataan println “Hello world from Command Line Runner” dijalankan setelah Tomcat dijalankan.

Properti Aplikasi mendukung kami untuk bekerja di lingkungan yang berbeda. Dalam bab ini, Anda akan mempelajari cara mengkonfigurasi dan menentukan properti untuk aplikasi Spring Boot.

Properti Baris Perintah

Aplikasi Spring Boot mengubah properti baris perintah menjadi properti Spring Boot Environment. Properti baris perintah lebih diutamakan daripada sumber properti lainnya. Secara default, Spring Boot menggunakan nomor port 8080 untuk memulai Tomcat. Mari kita pelajari cara mengubah nomor port dengan menggunakan properti baris perintah.

Step 1 - Setelah membuat file JAR yang dapat dieksekusi, jalankan dengan menggunakan perintah java –jar <JARFILE>.

Step 2 - Gunakan perintah yang diberikan pada tangkapan layar yang diberikan di bawah ini untuk mengubah nomor port untuk aplikasi Spring Boot dengan menggunakan properti baris perintah.

Note - Anda dapat menyediakan lebih dari satu properti aplikasi dengan menggunakan pemisah -.

File Properti

File properti digunakan untuk menyimpan sejumlah properti 'N' dalam satu file untuk menjalankan aplikasi di lingkungan yang berbeda. Di Spring Boot, properti disimpan di fileapplication.properties file di bawah classpath.

File application.properties terletak di src/main/resourcesdirektori. Kode untuk sampelapplication.properties file diberikan di bawah ini -

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

Perhatikan bahwa dalam kode yang ditunjukkan di atas layanan demo aplikasi Spring Boot dimulai pada port 9090.

File YAML

Spring Boot mendukung konfigurasi properti berbasis YAML untuk menjalankan aplikasi. Dari padaapplication.properties, kita bisa gunakan application.ymlmengajukan. File YAML ini juga harus disimpan di dalam classpath. Contohapplication.yml file diberikan di bawah ini -

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

Properti Eksternalisasi

Daripada menyimpan file properti di bawah classpath, kita bisa menyimpan properti di lokasi atau jalur berbeda. Saat menjalankan file JAR, kita dapat menentukan path file properti. Anda dapat menggunakan perintah berikut untuk menentukan lokasi file properti saat menjalankan JAR -

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

Penggunaan Anotasi @Value

Anotasi @Value digunakan untuk membaca lingkungan atau nilai properti aplikasi dalam kode Java. Sintaks untuk membaca nilai properti ditunjukkan di bawah ini -

@Value("${property_key_name}")

Lihat contoh berikut yang menunjukkan sintaks untuk membaca file spring.application.name nilai properti dalam variabel Java dengan menggunakan anotasi @Value.

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

Perhatikan kode yang diberikan di bawah ini untuk pemahaman yang lebih baik -

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 - Jika properti tidak ditemukan saat menjalankan aplikasi, Spring Boot akan menampilkan pengecualian Illegal Argument sebagai Could not resolve placeholder 'spring.application.name' in value "${spring.application.name}".

Untuk mengatasi masalah placeholder, kita dapat mengatur nilai default untuk properti menggunakan sintaks thr yang diberikan di bawah ini -

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

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

Profil Aktif Spring Boot

Spring Boot mendukung properti berbeda berdasarkan profil aktif Spring. Misalnya, kita dapat menyimpan dua file terpisah untuk pengembangan dan produksi untuk menjalankan aplikasi Spring Boot.

Profil aktif musim semi di application.properties

Mari kita pahami bagaimana memiliki profil aktif Spring di application.properties. Secara default, aplikasi. properti akan digunakan untuk menjalankan aplikasi Spring Boot. Jika Anda ingin menggunakan properti berbasis profil, kami dapat menyimpan file properti terpisah untuk setiap profil seperti yang ditunjukkan di bawah ini -

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

Saat menjalankan file JAR, kita perlu menentukan profil aktif pegas berdasarkan setiap file properti. Secara default, aplikasi Spring Boot menggunakan file application.properties. Perintah untuk mengatur profil aktif pegas ditunjukkan di bawah ini -

Anda dapat melihat nama profil aktif di log konsol seperti yang ditunjukkan di bawah ini -

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

Sekarang, Tomcat telah dimulai pada port 9090 (http) seperti yang ditunjukkan di bawah ini -

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

Anda dapat mengatur profil aktif Produksi seperti yang ditunjukkan di bawah ini -

Anda dapat melihat nama profil aktif di log konsol seperti yang ditunjukkan di bawah ini -

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

Sekarang, Tomcat mulai pada port 4431 (http) seperti yang ditunjukkan di bawah ini -

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

Profil aktif musim semi untuk application.yml

Mari kita pahami bagaimana menjaga profil aktif Spring untuk application.yml. Kita dapat menyimpan properti profil aktif Spring dalam satuapplication.ymlmengajukan. Tidak perlu menggunakan file terpisah seperti application.properties.

Berikut ini adalah contoh kode untuk menyimpan profil aktif Spring di file application.yml. Perhatikan bahwa pembatas (---) digunakan untuk memisahkan setiap profil dalam file 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

Untuk perintah untuk mengatur profil aktif pengembangan diberikan di bawah ini -

Anda dapat melihat nama profil aktif di log konsol seperti yang ditunjukkan di bawah ini -

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

Sekarang, Tomcat mulai pada port 9090 (http) seperti yang ditunjukkan di bawah ini -

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

Perintah untuk mengatur profil aktif Produksi diberikan di bawah ini -

Anda dapat melihat nama profil aktif di log konsol seperti yang ditunjukkan di bawah ini -

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

Ini akan memulai Tomcat pada port 4431 (http) seperti yang ditunjukkan di bawah ini:

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 menggunakan logging Apache Commons untuk semua logging internal. Konfigurasi default Spring Boot menyediakan dukungan untuk penggunaan Java Util Logging, Log4j2, dan Logback. Dengan menggunakan ini, kita dapat mengonfigurasi logging konsol serta logging file.

Jika Anda menggunakan Spring Boot Starters, Logback akan memberikan dukungan yang baik untuk logging. Selain itu, Logback juga menyediakan penggunaan dukungan yang baik untuk Common Logging, Util Logging, Log4J, dan SLF4J.

Format Log

Format Spring Boot Log default ditunjukkan pada gambar di bawah ini.

yang memberi Anda informasi berikut -

  • Date dan Time yang memberikan tanggal dan waktu log

  • Log level menampilkan INFO, ERROR atau WARN

  • Process ID

  • --- yang merupakan pemisah

  • Thread name diapit oleh tanda kurung siku []

  • Logger Name yang menunjukkan nama kelas Sumber

  • Pesan Log

Output Log Konsol

Pesan log default akan dicetak ke jendela konsol. Secara default, pesan log "INFO", "ERROR" dan "WARN" akan dicetak di file log.

Jika Anda harus mengaktifkan log level debug, tambahkan tanda debug saat memulai aplikasi Anda menggunakan perintah yang ditunjukkan di bawah ini -

java –jar demo.jar --debug

Anda juga dapat menambahkan mode debug ke file application.properties Anda seperti yang ditunjukkan di sini -

debug = true

Keluaran Log File

Secara default, semua log akan dicetak di jendela konsol dan bukan di file. Jika Anda ingin mencetak log dalam sebuah file, Anda perlu menyetel propertilogging.file atau logging.path di file application.properties.

Anda dapat menentukan jalur file log menggunakan properti yang ditunjukkan di bawah ini. Perhatikan bahwa nama file log adalah spring.log.

logging.path = /var/tmp/

Anda dapat menentukan nama file log sendiri menggunakan properti yang ditunjukkan di bawah ini -

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

Note - file akan berputar secara otomatis setelah mencapai ukuran 10 MB.

Tingkat Log

Spring Boot mendukung semua level logger seperti "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL", "OFF". Anda dapat menentukan Root logger di file application.properties seperti yang ditunjukkan di bawah ini -

logging.level.root = WARN

Note- Logback tidak mendukung log level "FATAL". Ini dipetakan ke log level "ERROR".

Konfigurasi Logback

Logback mendukung konfigurasi berbasis XML untuk menangani konfigurasi Spring Boot Log. Detail konfigurasi logging dikonfigurasikan dilogback.xmlmengajukan. File logback.xml harus ditempatkan di bawah classpath.

Anda dapat mengkonfigurasi log level ROOT di file Logback.xml menggunakan kode yang diberikan di bawah ini -

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

Anda dapat mengonfigurasi appender konsol di file Logback.xml yang diberikan di bawah ini.

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

Anda dapat mengkonfigurasi appender file di file Logback.xml menggunakan kode yang diberikan di bawah ini. Perhatikan bahwa Anda perlu menentukan jalur file Log dalam appender file.

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

Anda dapat menentukan pola Log masuk logback.xmlfile menggunakan kode yang diberikan di bawah ini. Anda juga dapat menentukan kumpulan pola log yang didukung di dalam konsol atau file log appender menggunakan kode yang diberikan di bawah ini -

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

Kode untuk file logback.xml lengkap diberikan di bawah ini. Anda harus menempatkan ini di jalur kelas.

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

Kode yang diberikan di bawah ini menunjukkan bagaimana menambahkan logger slf4j di file kelas utama 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);
   }
}

Output yang dapat Anda lihat di jendela konsol ditampilkan di sini -

Output yang dapat Anda lihat di file log ditampilkan di sini -

Spring Boot memberikan dukungan yang sangat baik untuk membangun Layanan Web RESTful untuk aplikasi perusahaan. Bab ini akan menjelaskan secara detail tentang membangun layanan web RESTful menggunakan Spring Boot.

Note - Untuk membangun Layanan Web RESTful, kita perlu menambahkan ketergantungan Web Spring Boot Starter ke dalam file konfigurasi build.

Jika Anda adalah pengguna Maven, gunakan kode berikut untuk menambahkan dependensi di bawah ini ke file pom.xml file -

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

Jika Anda adalah pengguna Gradle, gunakan kode berikut untuk menambahkan dependensi di bawah ini ke file build.gradle mengajukan.

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

Kode untuk file konfigurasi build lengkap Maven build – pom.xml diberikan di bawah -

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

Kode untuk file konfigurasi build lengkap Gradle Build – build.gradle diberikan di bawah -

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

Sebelum Anda melanjutkan untuk membangun layanan web RESTful, disarankan agar Anda memiliki pengetahuan tentang anotasi berikut -

Pengontrol Istirahat

Anotasi @RestController digunakan untuk menentukan layanan web RESTful. Ini melayani JSON, XML dan respons khusus. Sintaksnya ditunjukkan di bawah ini -

@RestController
public class ProductServiceController { 
}

Minta Pemetaan

Anotasi @RequestMapping digunakan untuk menentukan URI Permintaan untuk mengakses REST Endpoints. Kita dapat mendefinisikan metode Request untuk mengkonsumsi dan memproduksi objek. Metode permintaan default adalah GET.

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

Badan Permintaan

Anotasi @Requody digunakan untuk menentukan jenis konten isi permintaan.

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

Variabel Jalur

Anotasi @PathVable digunakan untuk menentukan URI permintaan khusus atau dinamis. Variabel Path dalam URI permintaan didefinisikan sebagai kurung kurawal {} seperti yang ditunjukkan di bawah ini -

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

Parameter Permintaan

Anotasi @RequestParam digunakan untuk membaca parameter permintaan dari URL Permintaan. Secara default, ini adalah parameter wajib. Kami juga dapat mengatur nilai default untuk parameter permintaan seperti yang ditunjukkan di sini -

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

DAPATKAN API

Metode permintaan HTTP default adalah GET. Metode ini tidak memerlukan Badan Permintaan apa pun. Anda dapat mengirim parameter permintaan dan variabel jalur untuk menentukan URL khusus atau dinamis.

Kode contoh untuk menentukan metode permintaan HTTP GET ditunjukkan di bawah ini. Dalam contoh ini, kami menggunakan HashMap untuk menyimpan Produk. Perhatikan bahwa kami menggunakan kelas POJO sebagai produk yang akan disimpan.

Di sini, URI permintaannya adalah /productsdan itu akan mengembalikan daftar produk dari repositori HashMap. File kelas kontroler diberikan di bawah ini yang berisi metode GET REST Endpoint.

package com.tutorialspoint.demo.controller;

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

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

import com.tutorialspoint.demo.model.Product;

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

API POST

Permintaan HTTP POST digunakan untuk membuat sumber daya. Metode ini berisi Badan Permintaan. Kami dapat mengirimkan parameter permintaan dan variabel jalur untuk menentukan URL khusus atau dinamis.

Contoh berikut menunjukkan kode sampel untuk menentukan metode permintaan HTTP POST. Dalam contoh ini, kami menggunakan HashMap untuk menyimpan Produk, di mana produk tersebut adalah kelas POJO.

Di sini, URI permintaannya adalah /products, dan itu akan mengembalikan String setelah menyimpan produk ke dalam repositori HashMap.

package com.tutorialspoint.demo.controller;

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

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

import com.tutorialspoint.demo.model.Product;

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

PUT API

Permintaan HTTP PUT digunakan untuk memperbarui sumber daya yang ada. Metode ini berisi Badan Permintaan. Kami dapat mengirimkan parameter permintaan dan variabel jalur untuk menentukan URL khusus atau dinamis.

Contoh yang diberikan di bawah ini menunjukkan bagaimana mendefinisikan metode permintaan HTTP PUT. Dalam contoh ini, kami menggunakan HashMap untuk memperbarui Produk yang ada, di mana produk tersebut adalah kelas POJO.

Di sini URI permintaannya /products/{id}yang akan mengembalikan String setelah produk ke dalam repositori HashMap. Perhatikan bahwa kami menggunakan variabel Path{id} yang menentukan ID produk yang perlu diperbarui.

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

HAPUS API

Permintaan HTTP Delete digunakan untuk menghapus sumber daya yang ada. Metode ini tidak berisi Badan Permintaan. Kami dapat mengirimkan parameter permintaan dan variabel jalur untuk menentukan URL khusus atau dinamis.

Contoh yang diberikan di bawah ini menunjukkan bagaimana mendefinisikan metode permintaan HTTP DELETE. Dalam contoh ini, kami menggunakan HashMap untuk menghapus produk yang sudah ada, yang merupakan kelas POJO.

URI permintaannya adalah /products/{id}dan itu akan mengembalikan String setelah menghapus produk dari repositori HashMap. Kami menggunakan variabel Path{id} yang menentukan ID produk yang perlu dihapus.

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

Bagian ini memberikan Anda set lengkap kode sumber. Perhatikan kode berikut untuk fungsinya masing-masing -

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

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi spring boot dengan menggunakan perintah Maven atau Gradle di bawah ini seperti yang ditunjukkan -

Untuk Maven, gunakan perintah yang ditunjukkan di bawah ini -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, gunakan perintah yang ditunjukkan di bawah ini -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Anda dapat menjalankan file JAR dengan menggunakan perintah yang ditunjukkan di bawah ini -

java –jar <JARFILE>

Ini akan memulai aplikasi pada port Tomcat 8080 seperti yang ditunjukkan di bawah ini -

Sekarang tekan URL yang ditunjukkan di bawah ini dalam aplikasi POSTMAN dan lihat hasilnya.

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

URL API POS adalah: http://localhost:8080/products

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

DELETE API URL adalah: http://localhost:8080/products/3

Menangani pengecualian dan kesalahan dalam API dan mengirimkan respons yang tepat ke klien bagus untuk aplikasi perusahaan. Di bab ini, kita akan mempelajari cara menangani pengecualian di Spring Boot.

Sebelum melanjutkan dengan penanganan pengecualian, mari kita mendapatkan pemahaman tentang anotasi berikut.

Saran Pengontrol

@ControllerAdvice adalah anotasi, untuk menangani pengecualian secara global.

Exception Handler

@ExceptionHandler adalah anotasi yang digunakan untuk menangani pengecualian tertentu dan mengirim respons khusus ke klien.

Anda dapat menggunakan kode berikut untuk membuat kelas @ControllerAdvice untuk menangani pengecualian secara global -

package com.tutorialspoint.demo.exception;

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

@ControllerAdvice
   public class ProductExceptionController {
}

Tentukan kelas yang memperluas kelas RuntimeException.

package com.tutorialspoint.demo.exception;

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

Anda dapat menentukan metode @ExceptionHandler untuk menangani pengecualian seperti yang ditunjukkan. Metode ini harus digunakan untuk menulis file kelas Saran Pengontrol.

@ExceptionHandler(value = ProductNotfoundException.class)

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

Sekarang, gunakan kode yang diberikan di bawah ini untuk membuang pengecualian dari API.

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

Kode lengkap untuk menangani pengecualian diberikan di bawah ini. Dalam contoh ini, kami menggunakan PUT API untuk memperbarui produk. Di sini, saat memperbarui produk, jika produk tidak ditemukan, kembalikan pesan kesalahan respons sebagai "Produk tidak ditemukan". Perhatikan bahwa fileProductNotFoundException kelas pengecualian harus memperpanjang RuntimeException.

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

Kelas Controller Advice untuk menangani pengecualian secara global diberikan di bawah ini. Kita bisa mendefinisikan metode Exception Handler di file kelas ini.

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

File pengontrol API Layanan Produk diberikan di bawah ini untuk memperbarui Produk. Jika Produk tidak ditemukan, maka itu melemparProductNotFoundException kelas.

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

Kode untuk file kelas aplikasi Spring Boot utama diberikan di bawah ini -

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

Kode untuk POJO class untuk Produk diberikan di bawah ini -

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

Kode untuk Maven build – pom.xml ditampilkan di bawah -

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

Kode untuk Gradle Build – build.gradle diberikan di bawah -

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

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot dengan menggunakan perintah Maven atau Gradle -

Untuk Maven, Anda dapat menggunakan perintah berikut -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, Anda dapat menggunakan perintah berikut -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Anda dapat menjalankan file JAR dengan menggunakan perintah berikut -

java –jar <JARFILE>

Ini akan memulai aplikasi pada port Tomcat 8080 seperti yang ditunjukkan di bawah ini -

Sekarang tekan URL di bawah ini di aplikasi POSTMAN dan Anda dapat melihat hasilnya seperti yang ditunjukkan di bawah ini -

Perbarui URL: http: // localhost: 8080 / products / 3

Anda dapat menggunakan Interceptor di Spring Boot untuk melakukan operasi dalam situasi berikut -

  • Sebelum mengirim permintaan ke pengontrol

  • Sebelum mengirimkan tanggapan ke klien

Misalnya, Anda dapat menggunakan interseptor untuk menambahkan header permintaan sebelum mengirim permintaan ke pengontrol dan menambahkan header respons sebelum mengirim respons ke klien.

Untuk bekerja dengan interseptor, Anda perlu membuat @Component kelas yang mendukungnya dan harus mengimplementasikan HandlerInterceptor antarmuka.

Berikut ini adalah tiga metode yang harus Anda ketahui saat mengerjakan Interceptors -

  • preHandle()metode - Ini digunakan untuk melakukan operasi sebelum mengirim permintaan ke pengontrol. Metode ini harus mengembalikan true untuk mengembalikan respons ke klien.

  • postHandle() metode - Ini digunakan untuk melakukan operasi sebelum mengirim respons ke klien.

  • afterCompletion() metode - Ini digunakan untuk melakukan operasi setelah menyelesaikan permintaan dan respons.

Perhatikan kode berikut untuk pemahaman yang lebih baik -

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

Anda harus mendaftarkan Interceptor ini dengan InterceptorRegistry dengan menggunakan WebMvcConfigurerAdapter seperti yang ditunjukkan di bawah ini -

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

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

Dalam contoh yang diberikan di bawah ini, kita akan menekan GET products API yang memberikan output seperti yang diberikan di bawah -

Kode untuk kelas Interceptor ProductServiceInterceptor.java diberikan di bawah ini -

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

Kode untuk file kelas Konfigurasi Aplikasi untuk mendaftarkan Interceptor ke dalam Registri Interceptor - ProductServiceInterceptorAppConfig.java diberikan di bawah ini -

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

Kode untuk file kelas Controller ProductServiceController.java diberikan di bawah ini -

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

Kode untuk kelas POJO untuk Product.java diberikan di bawah ini -

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

Kode untuk file kelas aplikasi Spring Boot utama DemoApplication.java diberikan di bawah -

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

Kode untuk Maven build - pom.xml ditampilkan di sini -

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

Kode untuk Gradle Build build.gradle ditampilkan di sini -

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

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot menggunakan perintah Maven atau Gradle di bawah ini.

Untuk Maven, gunakan perintah seperti yang ditunjukkan di bawah ini -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, gunakan perintah seperti yang ditunjukkan di bawah ini -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Anda dapat menjalankan file JAR dengan menggunakan perintah berikut -

java –jar <JARFILE>

Sekarang, aplikasi telah dimulai pada port Tomcat 8080 seperti yang ditunjukkan di bawah ini -

Sekarang tekan URL di bawah ini dalam aplikasi POSTMAN dan Anda dapat melihat hasilnya seperti yang ditunjukkan di bawah -

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

Di jendela konsol, Anda dapat melihat pernyataan System.out.println yang ditambahkan di Interceptor seperti yang ditunjukkan pada gambar di bawah -

Filter adalah objek yang digunakan untuk mencegat permintaan dan respons HTTP dari aplikasi Anda. Dengan menggunakan filter, kita dapat melakukan dua operasi pada dua contoh -

  • Sebelum mengirim permintaan ke pengontrol
  • Sebelum mengirim tanggapan ke klien.

Kode berikut menunjukkan kode sampel untuk kelas implementasi Servlet Filter dengan penjelasan @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 {}
}

Contoh berikut menunjukkan kode untuk membaca host jarak jauh dan alamat jarak jauh dari objek ServletRequest sebelum mengirim permintaan ke pengontrol.

Dalam metode doFilter (), kami telah menambahkan pernyataan System.out.println untuk mencetak host jarak jauh dan alamat jarak jauh.

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

Di file kelas aplikasi utama Spring Boot, kami telah menambahkan titik akhir REST sederhana yang mengembalikan string "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";
   }
}

Kode untuk Maven build - pom.xml diberikan di bawah -

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

Kode untuk Gradle Build - build.gradle diberikan di bawah ini -

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

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot menggunakan perintah Maven atau Gradle yang ditunjukkan di bawah ini -

Untuk Maven, gunakan perintah seperti yang ditunjukkan di bawah ini -

mvn clean install

Setelah BUILD SUCCESS, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, gunakan perintah seperti yang ditunjukkan di bawah ini -

gradle clean build

Setelah BUILD BERHASIL, Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah berikut

java –jar <JARFILE>

Anda dapat melihat aplikasi telah dimulai pada port Tomcat 8080.

Sekarang tekan URL http://localhost:8080/dan lihat output Hello World. Ini akan terlihat seperti yang ditunjukkan di bawah ini -

Kemudian, Anda dapat melihat Host jarak jauh dan alamat jarak jauh di log konsol seperti yang ditunjukkan di bawah ini -

Spring Boot memungkinkan Anda menjalankan aplikasi yang sama lebih dari sekali pada nomor port yang berbeda. Dalam bab ini, Anda akan mempelajari hal ini secara mendetail. Perhatikan bahwa nomor port default 8080.

Port Kustom

Dalam application.properties file, kita dapat mengatur nomor port khusus untuk properti server.port

server.port = 9090

Dalam application.yml file, Anda dapat menemukan sebagai berikut -

server: 
   port: 9090

Port Acak

Dalam application.properties file, kita dapat mengatur nomor port acak untuk properti server.port

server.port = 0

Dalam application.yml file, Anda dapat menemukan sebagai berikut -

server: 
   port: 0

Note - Jika server.port angka 0 saat memulai aplikasi Spring Boot, Tomcat menggunakan nomor port acak.

Template Istirahat digunakan untuk membuat aplikasi yang menggunakan Layanan Web RESTful. Anda bisa menggunakanexchange()metode untuk menggunakan layanan web untuk semua metode HTTP. Kode yang diberikan di bawah ini menunjukkan bagaimana membuat Bean for Rest Template ke auto wiring objek 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();
   }
}

DAPATKAN

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

Asumsikan URL ini http://localhost:8080/products mengembalikan JSON berikut dan kami akan menggunakan respons API ini dengan menggunakan Template Istirahat menggunakan kode berikut -

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

Anda harus mengikuti poin yang diberikan untuk menggunakan API -

  • Autowired Objek Template Istirahat.
  • Gunakan HttpHeaders untuk mengatur Header Permintaan.
  • Gunakan HttpEntity untuk membungkus objek permintaan.
  • Berikan URL, HttpMethod, dan Return type untuk metode 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();
   }
}

POS

Consuming POST API by using RestTemplate - exchange() method

Asumsikan URL ini http://localhost:8080/products mengembalikan respons yang ditunjukkan di bawah ini, kita akan menggunakan respons API ini dengan menggunakan Template Istirahat.

Kode yang diberikan di bawah ini adalah Request body -

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

Kode yang diberikan di bawah ini adalah Badan Respon -

Product is created successfully

Anda harus mengikuti poin yang diberikan di bawah ini untuk menggunakan API -

  • Autowired Objek Template Istirahat.

  • Gunakan HttpHeaders untuk mengatur Header Permintaan.

  • Gunakan HttpEntity untuk membungkus objek permintaan. Di sini, kami membungkus objek Produk untuk mengirimkannya ke badan permintaan.

  • Berikan URL, HttpMethod, dan jenis Return untuk metode 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();
   }
}

TARUH

Consuming PUT API by using RestTemplate - exchange() method

Asumsikan URL ini http://localhost:8080/products/3 mengembalikan respons di bawah ini dan kami akan menggunakan respons API ini dengan menggunakan Template Istirahat.

Kode yang diberikan di bawah ini adalah Request body -

{
   "name":"Indian Ginger"
}

Kode yang diberikan di bawah ini adalah Badan Respon -

Product is updated successfully

Anda harus mengikuti poin yang diberikan di bawah ini untuk menggunakan API -

  • Autowired Objek Template Istirahat.

  • Gunakan HttpHeaders untuk mengatur Header Permintaan.

  • Gunakan HttpEntity untuk membungkus objek permintaan. Di sini, kami membungkus objek Produk untuk mengirimkannya ke badan permintaan.

  • Berikan URL, HttpMethod, dan jenis Return untuk metode 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();
   }
}

MENGHAPUS

Consuming DELETE API by using RestTemplate - exchange() method

Asumsikan URL ini http://localhost:8080/products/3 mengembalikan respons yang diberikan di bawah ini dan kami akan menggunakan respons API ini dengan menggunakan Template Istirahat.

Baris kode yang ditunjukkan di bawah ini adalah badan Respon -

Product is deleted successfully

Anda harus mengikuti poin yang ditunjukkan di bawah ini untuk menggunakan API -

  • Autowired Objek Template Istirahat.

  • Gunakan HttpHeaders untuk mengatur Header Permintaan.

  • Gunakan HttpEntity untuk membungkus objek permintaan.

  • Berikan URL, HttpMethod, dan jenis Return untuk metode 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();
   }
}

File kelas Rest Template Controller lengkap diberikan di bawah ini -

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

Kode untuk Kelas Aplikasi Spring Boot - DemoApplication.java diberikan di bawah ini -

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

Kode untuk Maven build - pom.xml diberikan di bawah ini -

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

Kode untuk Gradle Build - build.gradle diberikan di bawah ini -

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

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot dengan menggunakan perintah Maven atau Gradle berikut -

Untuk Maven, Anda dapat menggunakan perintah yang diberikan di bawah ini -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, Anda dapat menggunakan perintah yang ditunjukkan di bawah ini -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah berikut -

java –jar <JARFILE>

Sekarang, aplikasi telah dimulai pada port Tomcat 8080.

Sekarang tekan URL di bawah ini dalam aplikasi POSTMAN dan Anda dapat melihat hasilnya.

DAPATKAN Produk dengan Template Istirahat - http://localhost:8080/template/products

Buat Produk POST - http://localhost:8080/template/products

Perbarui PUT Produk - http://localhost:8080/template/products/3

Hapus Produk - http://localhost:8080/template/products/3

Pada bab ini, Anda akan mempelajari cara mengunggah dan mengunduh file dengan menggunakan layanan web.

Unggah File

Untuk mengupload file, Anda bisa menggunakan MultipartFilesebagai Parameter Permintaan dan API ini harus menggunakan nilai data formulir Multi-Bagian. Perhatikan kode yang diberikan di bawah ini -

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

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

Kode lengkap untuk yang sama diberikan di bawah ini -

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

Unduh File

Untuk mengunduh file, Anda harus menggunakan InputStreamResource untuk mengunduh File. Kita perlu menyetel HttpHeaderContent-Disposition dalam Respon dan perlu menentukan Respon Jenis Media aplikasi.

Note - Dalam contoh berikut, file harus tersedia di jalur yang ditentukan di mana aplikasi sedang berjalan.

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

Kode lengkap untuk yang sama diberikan di bawah ini -

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

Aplikasi Spring Boot utama diberikan di bawah ini -

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

Kode untuk Maven build - pom.xml diberikan di bawah ini -

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

Kode untuk Gradle Build - build.gradle diberikan di bawah ini -

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

Sekarang Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot dengan menggunakan perintah Maven atau Gradle yang diberikan di bawah ini -

Untuk Maven, gunakan perintah yang diberikan di bawah ini -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, Anda dapat menggunakan perintah yang ditunjukkan di bawah ini -

sgradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah berikut -

java –jar <JARFILE>

Ini akan memulai aplikasi pada port Tomcat 8080 seperti yang ditunjukkan di bawah ini -

Sekarang tekan URL di bawah ini dalam aplikasi POSTMAN dan Anda dapat melihat hasilnya seperti yang ditunjukkan di bawah ini -

Unggah file - http://localhost:8080/upload

Download file - http://localhost:8080/upload

Komponen Layanan adalah file kelas yang berisi penjelasan @Service. File kelas ini digunakan untuk menulis logika bisnis di lapisan yang berbeda, dipisahkan dari file kelas @RestController. Logika untuk membuat file kelas komponen layanan ditampilkan di sini -

public interface ProductService {
}

Kelas yang mengimplementasikan Antarmuka dengan anotasi @Service adalah seperti yang ditunjukkan -

@Service
public class ProductServiceImpl implements ProductService {
}

Perhatikan bahwa dalam tutorial ini, kami menggunakan Product Service API(s)untuk menyimpan, mengambil, memperbarui dan menghapus produk. Kami menulis logika bisnis di file kelas @RestController itu sendiri. Sekarang, kita akan memindahkan kode logika bisnis dari pengontrol ke komponen layanan.

Anda dapat membuat Antarmuka yang berisi metode tambah, edit, dapatkan, dan hapus menggunakan kode seperti yang ditunjukkan di bawah ini -

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

Kode berikut akan memungkinkan Anda membuat kelas yang mengimplementasikan antarmuka ProductService dengan anotasi @Service dan menulis logika bisnis untuk menyimpan, mengambil, menghapus, dan memperbarui produk.

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

Kode di sini menunjukkan file kelas Rest Controller, di sini kami @Autowired antarmuka ProductService dan memanggil metode.

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

Kode untuk kelas POJO - Product.java ditampilkan di sini -

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

Aplikasi Spring Boot utama diberikan di bawah ini -

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

Kode untuk Maven build - pom.xml ditunjukkan di bawah ini -

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

Kode untuk Gradle Build - build.gradle ditunjukkan di bawah ini -

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

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot dengan menggunakan perintah Maven atau Gradle yang diberikan di bawah ini -

Untuk Maven, gunakan perintah seperti yang ditunjukkan di bawah ini -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, Anda dapat menggunakan perintah seperti yang ditunjukkan di bawah ini -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Jalankan file JAR dengan menggunakan perintah yang diberikan di bawah ini -

java –jar <JARFILE>

Sekarang, aplikasi telah dimulai pada port Tomcat 8080 seperti yang ditunjukkan pada gambar di bawah ini -

Sekarang tekan URL di bawah ini dalam aplikasi POSTMAN dan Anda dapat melihat hasilnya seperti yang ditunjukkan di bawah ini -

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

URL API POS adalah - http://localhost:8080/products

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

DELETE API URL adalah - http://localhost:8080/products/3

Thymeleaf adalah perpustakaan berbasis Java yang digunakan untuk membuat aplikasi web. Ini memberikan dukungan yang baik untuk melayani XHTML / HTML5 dalam aplikasi web. Dalam bab ini, Anda akan belajar secara detail tentang Timeleaf.

Template Timeleaf

Thymeleaf mengubah file Anda menjadi file XML dengan format yang baik. Ini berisi 6 jenis template seperti yang diberikan di bawah ini -

  • XML
  • XML yang valid
  • XHTML
  • XHTML yang valid
  • HTML5
  • HTML5 lama

Semua template, kecuali Legacy HTML5, mengacu pada file XML valid yang dibentuk dengan baik. HTML5 lama memungkinkan kita untuk merender tag HTML5 di halaman web termasuk tag bukan tertutup.

Aplikasi web

Anda dapat menggunakan template Thymeleaf untuk membuat aplikasi web di Spring Boot. Anda harus mengikuti langkah-langkah di bawah ini untuk membuat aplikasi web di Spring Boot dengan menggunakan Thymeleaf.

Gunakan kode berikut untuk membuat file kelas @Controller untuk mengalihkan URI Permintaan ke file 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";
   }
}

Dalam contoh di atas, URI permintaannya adalah /index, dan kontrol diarahkan ke file index.html. Perhatikan bahwa file index.html harus ditempatkan di bawah direktori template dan semua file JS dan CSS harus ditempatkan di bawah direktori statis di classpath. Dalam contoh yang ditunjukkan, kami menggunakan file CSS untuk mengubah warna teks.

Anda dapat menggunakan kode berikut dan membuat file CSS di folder terpisah css dan beri nama file sebagai styles.css -

h4 {
   color: red;
}

Kode untuk file index.html diberikan di bawah ini -

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

Penjelajah proyek ditunjukkan pada gambar yang diberikan di bawah ini -

Sekarang, kita perlu menambahkan dependensi Thymeleaf Spring Boot Starter di file konfigurasi build kita.

Pengguna Maven dapat menambahkan ketergantungan berikut ke file pom.xml -

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

Pengguna Gradle dapat menambahkan dependensi berikut dalam file build.gradle -

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

Kode untuk file kelas aplikasi Spring Boot utama diberikan di bawah ini -

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

Kode untuk Maven - pom.xml diberikan di bawah ini -

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

Kode untuk Gradle - build.gradle diberikan di bawah ini -

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

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi spring boot dengan menggunakan perintah Maven atau Gradle berikut -

Untuk Maven, gunakan perintah seperti yang ditunjukkan di bawah ini -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, gunakan perintah seperti yang ditunjukkan di bawah ini -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Jalankan file JAR dengan menggunakan perintah yang diberikan di sini -

java –jar <JARFILE>

Sekarang, aplikasi telah dimulai pada port Tomcat 8080 seperti yang ditunjukkan di bawah ini -

Sekarang tekan URL di browser web Anda dan Anda dapat melihat hasilnya seperti yang ditunjukkan -

http://localhost:8080/index

Bab ini akan membahas secara detail tentang menggunakan Layanan Web RESTful dengan menggunakan jQuery AJAX.

Buat aplikasi web Spring Boot sederhana dan tulis file kelas pengontrol yang digunakan untuk dialihkan ke file HTML untuk menggunakan layanan web RESTful.

Kita perlu menambahkan Thymeleaf starter Spring Boot dan dependensi Web di file konfigurasi build kita.

Untuk pengguna Maven, tambahkan dependensi di bawah ini ke file pom.xml Anda.

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

Untuk pengguna Gradle, tambahkan dependensi di bawah ini ke dalam file build.gradle Anda -

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

Kode untuk file kelas @Controller diberikan di bawah ini -

@Controller
public class ViewController {
}

Anda dapat menentukan metode URI Permintaan untuk dialihkan ke file HTML seperti yang ditunjukkan di bawah ini -

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

API ini http://localhost:9090/products harus mengembalikan JSON di bawah sebagai tanggapan seperti yang ditunjukkan di bawah ini -

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

Sekarang, buat file view-products.html di bawah direktori templates di classpath.

Di file HTML, kami menambahkan pustaka jQuery dan menulis kode untuk menggunakan layanan web RESTful saat pemuatan halaman.

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

Metode POST dan URL ini http://localhost:9090/products harus berisi Badan Permintaan dan Badan Tanggapan di bawah ini.

Kode untuk badan Permintaan diberikan di bawah ini -

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

Kode untuk tubuh Respon diberikan di bawah ini -

Product is created successfully

Sekarang, buat file add-products.html di bawah direktori templates di classpath.

Di file HTML, kami menambahkan pustaka jQuery dan menulis kode yang mengirimkan formulir ke layanan web RESTful dengan mengklik tombol.

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

Kode lengkap diberikan di bawah ini.

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

Kode untuk Gradle - build.gradle diberikan di bawah ini -

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

File kelas controller diberikan di bawah ini - ViewController.java diberikan di bawah ini -

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

File view-products.html diberikan di bawah ini -

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

File add-products.html diberikan di bawah ini -

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

File kelas Aplikasi Spring Boot utama diberikan di bawah ini -

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

Sekarang, Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot dengan menggunakan perintah Maven atau Gradle berikut.

Untuk Maven, gunakan perintah seperti yang diberikan di bawah ini -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, gunakan perintah seperti yang diberikan di bawah ini -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Jalankan file JAR dengan menggunakan perintah berikut -

java –jar <JARFILE>

Sekarang, aplikasi telah dimulai pada port Tomcat 8080.

Sekarang tekan URL di browser web Anda dan Anda dapat melihat hasilnya seperti yang ditunjukkan -

http: // localhost: 8080 / lihat-produk

http: // localhost: 8080 / add-products

Sekarang, klik tombolnya Click here to submit the form dan Anda dapat melihat hasilnya seperti yang ditunjukkan -

Sekarang, tekan URL lihat produk dan lihat produk yang dibuat.

http://localhost:8080/view-products

JS sudut

Untuk menggunakan API dengan menggunakan Angular JS, Anda dapat menggunakan contoh yang diberikan di bawah ini -

Gunakan kode berikut untuk membuat Angular JS Controller untuk menggunakan GET API - http://localhost:9090/products -

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

Gunakan kode berikut untuk membuat Angular JS Controller untuk menggunakan 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 - Data metode Post merepresentasikan isi Request dalam format JSON untuk membuat produk.

Cross-Origin Resource Sharing (CORS) adalah konsep keamanan yang memungkinkan pembatasan sumber daya yang diterapkan di browser web. Ini mencegah kode JavaScript menghasilkan atau mengonsumsi permintaan terhadap asal yang berbeda.

Misalnya, aplikasi web Anda berjalan pada port 8080 dan dengan menggunakan JavaScript Anda mencoba menggunakan layanan web RESTful dari port 9090. Dalam situasi seperti itu, Anda akan menghadapi masalah keamanan Berbagi Sumber Daya Lintas Asal di browser web Anda.

Dua persyaratan diperlukan untuk menangani masalah ini -

  • Layanan web yang tenang harus mendukung Cross-Origin Resource Sharing.

  • Aplikasi layanan web yang tenang harus mengizinkan akses API dari port 8080.

Dalam bab ini, kita akan mempelajari secara detail tentang Cara Mengaktifkan Permintaan Lintas Asal untuk aplikasi RESTful Web Service.

Aktifkan CORS dalam Metode Pengontrol

Kita perlu menyetel asal untuk layanan web RESTful dengan menggunakan @CrossOriginanotasi untuk metode pengontrol. Anotasi @CrossOrigin ini mendukung REST API tertentu, dan bukan untuk seluruh aplikasi.

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

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

Konfigurasi CORS Global

Kita perlu mendefinisikan konfigurasi @Bean yang ditampilkan untuk mengatur dukungan konfigurasi CORS secara global ke aplikasi Spring Boot Anda.

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

Untuk kode untuk mengatur konfigurasi CORS secara global di aplikasi Spring Boot utama diberikan di bawah ini.

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

Sekarang, Anda dapat membuat aplikasi web Spring Boot yang berjalan pada port 8080 dan aplikasi layanan web RESTful yang dapat berjalan pada port 9090. Untuk detail lebih lanjut tentang implementasi tentang RESTful Web Service, Anda dapat merujuk ke bab berjudulConsuming RESTful Web Services dari tutorial ini.

Internasionalisasi adalah proses yang membuat aplikasi Anda dapat beradaptasi dengan berbagai bahasa dan wilayah tanpa perubahan teknis pada kode sumber. Dengan kata lain, Internasionalisasi adalah kesiapan Lokalisasi.

Dalam bab ini, kita akan belajar secara detail tentang Bagaimana menerapkan Internasionalisasi di Boot Musim Semi.

Dependensi

Kami membutuhkan ketergantungan Spring Boot Starter Web dan Spring Boot Starter Thymeleaf untuk mengembangkan aplikasi web di 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

Kami perlu menentukan Lokal default aplikasi Anda. Kita perlu menambahkan kacang LocaleResolver di aplikasi Spring Boot kita.

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

LocaleChangeInterceptor

LocaleChangeInterceptor digunakan untuk mengubah Lokal baru berdasarkan nilai parameter bahasa yang ditambahkan ke permintaan.

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

Untuk mendapatkan efek ini, kita perlu menambahkan LocaleChangeInterceptor ke dalam registry interseptor aplikasi. Kelas konfigurasi harus memperluas kelas WebMvcConfigurerAdapter dan mengganti metode addInterceptors ().

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

Sumber Pesan

Aplikasi Spring Boot secara default mengambil sumber pesan dari src/main/resourcesfolder di bawah classpath. Nama file pesan lokal default harusmessage.properties dan file untuk setiap lokal harus diberi nama sebagai messages_XX.properties. "XX" mewakili kode lokal.

Semua properti pesan harus digunakan sebagai nilai pasangan kunci. Jika ada properti yang tidak ditemukan di lokal, aplikasi menggunakan properti default dari file messages.properties.

Properti messages.properties default akan seperti yang ditunjukkan -

welcome.text=Hi Welcome to Everyone

Properti messages_fr.properties bahasa Prancis akan seperti yang ditunjukkan -

welcome.text=Salut Bienvenue à tous

Note - File sumber pesan harus disimpan sebagai format file "UTF-8".

File HTML

Di file HTML, gunakan sintaks #{key} untuk menampilkan pesan dari file properti.

<h1 th:text = "#{welcome.text}"></h1>

Kode lengkap diberikan di bawah ini

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

File kelas aplikasi Spring Boot utama diberikan di bawah ini -

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

File kelas pengontrol diberikan di bawah ini -

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

Kelas konfigurasi untuk mendukung Internasionalisasi

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

Sumber pesan - properti pesan seperti yang ditunjukkan -

welcome.text = Hi Welcome to Everyone

Sumber pesan - message_fr.properties adalah seperti yang ditunjukkan -

welcome.text = Salut Bienvenue à tous

File HTML locale.html harus ditempatkan di bawah direktori templates di classpath seperti yang ditunjukkan -

<!DOCTYPE html>
<html>
   <head>
      <meta charset = "ISO-8859-1"/>
      <title>Internationalization</title>
   </head>
   <body>
      <h1 th:text = "#{welcome.text}"></h1>
   </body>
</html>

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring boot dengan menggunakan perintah Maven atau Gradle berikut -

Untuk Maven, gunakan perintah berikut -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, gunakan perintah berikut -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah seperti yang ditunjukkan -

java –jar <JARFILE>

Anda akan menemukan bahwa aplikasi telah dimulai pada port Tomcat 8080.

Sekarang tekan URL http://localhost:8080/locale di browser web Anda dan Anda dapat melihat output berikut -

URL http://localhost:8080/locale?language=fr akan memberi Anda output seperti yang ditunjukkan -

Penjadwalan adalah proses menjalankan tugas untuk jangka waktu tertentu. Spring Boot menyediakan dukungan yang baik untuk menulis penjadwal pada aplikasi Spring.

Ekspresi Cron Java

Ekspresi Java Cron digunakan untuk mengonfigurasi instance CronTrigger, subkelas dari org.quartz.Trigger. Untuk informasi selengkapnya tentang ekspresi cron Java, Anda dapat merujuk ke tautan ini -

https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm

Anotasi @EnableScheduling digunakan untuk mengaktifkan penjadwal untuk aplikasi Anda. Anotasi ini harus ditambahkan ke file kelas aplikasi Spring Boot utama.

@SpringBootApplication
@EnableScheduling

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

Anotasi @Jadwal digunakan untuk memicu penjadwal untuk jangka waktu tertentu.

@Scheduled(cron = "0 * 9 * * ?")
public void cronJobSch() throws Exception {
}

Berikut ini adalah contoh kode yang menunjukkan cara menjalankan tugas setiap menit mulai pukul 09:00 dan berakhir pada pukul 09:59, setiap hari

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

Tangkapan layar berikut menunjukkan bagaimana aplikasi dimulai pada 09:03:23 dan untuk setiap satu menit sejak waktu itu tugas penjadwal tugas cron telah dijalankan.

Tarif Tetap

Penjadwal Tarif Tetap digunakan untuk menjalankan tugas pada waktu tertentu. Itu tidak menunggu penyelesaian tugas sebelumnya. Nilainya harus dalam milidetik. Kode sampel ditampilkan di sini -

@Scheduled(fixedRate = 1000)
public void fixedRateSch() { 
}

Kode contoh untuk menjalankan tugas setiap detik dari startup aplikasi ditampilkan di sini -

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

Perhatikan tangkapan layar berikut yang menunjukkan aplikasi yang telah dimulai pada 09:12:00 dan setelah itu setiap tugas penjadwal tarif tetap kedua telah dijalankan.

Penundaan Tetap

Penjadwal Penundaan Tetap digunakan untuk menjalankan tugas pada waktu tertentu. Itu harus menunggu penyelesaian tugas sebelumnya. Nilainya harus dalam milidetik. Kode contoh ditampilkan di sini -

@Scheduled(fixedDelay = 1000, initialDelay = 1000)
public void fixedDelaySch() {
}

Di sini, initialDelay adalah waktu saat tugas akan dijalankan pertama kali setelah nilai penundaan awal.

Contoh untuk menjalankan tugas setiap detik setelah 3 detik dari startup aplikasi selesai ditampilkan di bawah ini -

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

Perhatikan tangkapan layar berikut yang menunjukkan aplikasi yang telah dimulai pada 09:18:39 dan setelah setiap 3 detik, tugas penjadwal penundaan tetap telah dijalankan setiap detik.

Secara default, aplikasi Spring Boot menggunakan port HTTP 8080 saat aplikasi dijalankan.

Anda perlu mengikuti langkah-langkah yang diberikan di bawah ini untuk mengkonfigurasi HTTPS dan port 443 di aplikasi Spring Boot -

  • Dapatkan sertifikat SSL - Buat sertifikat yang ditandatangani sendiri atau dapatkan dari Otoritas Sertifikat

  • Aktifkan HTTPS dan port 443

Sertifikat yang Ditandatangani Sendiri

Untuk membuat sertifikat yang ditandatangani sendiri, lingkungan Java Run Time dilengkapi dengan alat kunci utilitas manajemen sertifikat. Alat utilitas ini digunakan untuk membuat sertifikat yang Ditandatangani Sendiri. Itu ditunjukkan dalam kode yang diberikan di sini -

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

Kode ini akan menghasilkan file keystore PKCS12 dengan nama keystore.p12 dan nama alias sertifikatnya adalah tomcat.

Konfigurasi HTTPS

Kita perlu menyediakan port server sebagai 443, jalur file penyimpanan kunci, sandi penyimpanan kunci, jenis penyimpanan kunci, dan nama alias kunci ke dalam file application.properties. Perhatikan kode yang diberikan di sini -

server.port: 443
server.ssl.key-store: keystore.p12
server.ssl.key-store-password: springboot
server.ssl.keyStoreType: PKCS12
server.ssl.keyAlias: tomcat

Anda dapat menggunakan kode berikut jika Anda menggunakan properti YAML gunakan di bawah application.yml -

server:
   port: 443
   ssl:
      key-store: keystore.p12
      key-store-password: springboot
      keyStoreType: PKCS12
      keyAlias: tomcat

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi spring boot dengan menggunakan perintah Maven atau Gradle berikut.

Untuk Maven, Anda dapat menggunakan perintah berikut -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, Anda dapat menggunakan perintah

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah berikut -

java –jar <JARFILE>

Sekarang, aplikasi telah dimulai pada port Tomcat 443 dengan https seperti yang ditunjukkan -

Eureka Server adalah sebuah aplikasi yang menyimpan informasi tentang semua aplikasi layanan klien. Setiap layanan Mikro akan mendaftar ke server Eureka dan server Eureka mengetahui semua aplikasi klien yang berjalan di setiap port dan alamat IP. Eureka Server juga dikenal sebagai Discovery Server.

Pada bab ini, kita akan mempelajari secara detail tentang Bagaimana membangun server Eureka.

Membangun Server Eureka

Server Eureka hadir dengan paket Spring Cloud. Untuk ini, kita perlu mengembangkan server Eureka dan menjalankannya pada port default 8761.

Kunjungi beranda Spring Initializer https://start.spring.io/dan unduh proyek Spring Boot dengan ketergantungan server Eureka. Itu ditunjukkan pada gambar di bawah -

Setelah mengunduh proyek dalam file kelas Aplikasi Spring Boot utama, kita perlu menambahkan anotasi @EnableEurekaServer. Anotasi @EnableEurekaServer digunakan untuk membuat aplikasi Spring Boot Anda berfungsi sebagai Server Eureka.

Kode untuk file kelas aplikasi Spring Boot utama adalah seperti yang ditunjukkan di bawah ini -

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

Pastikan dependensi server Spring cloud Eureka ditambahkan di file konfigurasi build Anda.

Kode untuk ketergantungan pengguna Maven ditunjukkan di bawah ini -

<dependency>
<groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

Kode untuk dependensi pengguna Gradle diberikan di bawah ini -

compile('org.springframework.cloud:spring-cloud-starter-eureka-server')

File konfigurasi build lengkap diberikan di bawah ini -

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

Secara default, Server Eureka mendaftarkan dirinya ke dalam penemuan. Anda harus menambahkan konfigurasi yang diberikan di bawah ini ke dalam file application.properties atau file application.yml.

File application.properties diberikan di bawah ini -

eureka.client.registerWithEureka = false
eureka.client.fetchRegistry = false
server.port = 8761

File application.yml diberikan di bawah ini -

eureka:
   client:
      registerWithEureka: false
      fetchRegistry: false
server:
   port: 8761

Sekarang, Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot dengan menggunakan perintah Maven atau Gradle yang ditunjukkan di bawah ini -

Untuk Maven, gunakan perintah seperti yang ditunjukkan di bawah ini -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, Anda dapat menggunakan perintah yang ditunjukkan di bawah ini -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah berikut -

java –jar <JARFILE>

Anda dapat menemukan bahwa aplikasi telah dimulai pada port Tomcat 8761 seperti yang ditunjukkan di bawah ini -

Sekarang, tekan URL http://localhost:8761/ di browser web Anda dan Anda dapat menemukan Server Eureka yang berjalan pada port 8761 seperti yang ditunjukkan di bawah ini -

Di bab ini, Anda akan mempelajari secara detail tentang Cara mendaftarkan aplikasi layanan Spring Boot Micro ke dalam Server Eureka. Sebelum mendaftarkan aplikasi, pastikan Server Eureka berjalan pada port 8761 atau bangun Server Eureka terlebih dahulu dan jalankan. Untuk informasi lebih lanjut tentang membangun server Eureka, Anda dapat merujuk ke bab sebelumnya.

Pertama, Anda perlu menambahkan dependensi berikut di file konfigurasi build kami untuk mendaftarkan layanan mikro dengan server Eureka.

Pengguna Maven dapat menambahkan dependensi berikut ke dalam file pom.xml file -

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

Pengguna Gradle dapat menambahkan dependensi berikut ke dalam build.gradle file -

compile('org.springframework.cloud:spring-cloud-starter-eureka')

Sekarang, kita perlu menambahkan anotasi @EnableEurekaClient di file kelas aplikasi Spring Boot utama. Anotasi @EnableEurekaClient membuat aplikasi Spring Boot Anda berfungsi sebagai klien Eureka.

Aplikasi Spring Boot utama seperti yang diberikan di bawah ini -

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

Untuk mendaftarkan aplikasi Spring Boot ke Eureka Server kita perlu menambahkan konfigurasi berikut di file application.properties atau file application.yml dan menentukan URL Server Eureka di konfigurasi kita.

Kode untuk file application.yml diberikan di bawah ini -

eureka:
   client:
      serviceUrl:
         defaultZone: http://localhost:8761/eureka
      instance:
      preferIpAddress: true
spring:
   application:
      name: eurekaclient

Kode untuk file application.properties diberikan di bawah ini -

eureka.client.serviceUrl.defaultZone  = http://localhost:8761/eureka
eureka.client.instance.preferIpAddress = true
spring.application.name = eurekaclient

Sekarang, tambahkan Rest Endpoint untuk mengembalikan String di aplikasi Spring Boot utama dan ketergantungan web Spring Boot Starter di file konfigurasi build. Perhatikan kode yang diberikan di bawah ini -

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

Seluruh file konfigurasi diberikan di bawah ini.

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

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot dengan menggunakan perintah Maven atau Gradle berikut -

Untuk Maven, Anda dapat menggunakan perintah berikut -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, Anda dapat menggunakan perintah berikut -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah seperti yang ditunjukkan -

java –jar <JARFILE>

Sekarang, aplikasi telah dimulai di port Tomcat 8080 dan aplikasi Klien Eureka terdaftar di Server Eureka seperti yang ditunjukkan di bawah ini -

Tekan URL http: // localhost: 8761 / di browser web Anda dan Anda dapat melihat aplikasi Klien Eureka terdaftar di Server Eureka.

Sekarang tekan URL http://localhost:8080/ di browser web Anda dan lihat keluaran Rest Endpoint.

Zuul Server adalah aplikasi gateway yang menangani semua permintaan dan melakukan perutean dinamis aplikasi layanan mikro. Server Zuul juga dikenal sebagai Server Edge.

Sebagai contoh, /api/user dipetakan ke layanan pengguna dan / api / produk dipetakan ke layanan produk dan Zuul Server secara dinamis mengarahkan permintaan ke aplikasi backend masing-masing.

Pada bab ini, kita akan melihat secara detail cara membuat aplikasi Zuul Server di Spring Boot.

Membuat Aplikasi Zuul Server

Server Zuul dibundel dengan ketergantungan Spring Cloud. Anda dapat mendownload proyek Spring Boot dari halaman Spring Initializerhttps://start.spring.io/ dan pilih ketergantungan Zuul Server.

Tambahkan anotasi @EnableZuulProxy pada aplikasi Spring Boot utama Anda. Anotasi @EnableZuulProxy digunakan untuk membuat aplikasi Spring Boot Anda bertindak sebagai server Proxy Zuul.

package com.tutorialspoint.zuulserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

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

Anda harus menambahkan dependensi Spring Cloud Starter Zuul di file konfigurasi build kami.

Pengguna Maven harus menambahkan dependensi berikut di pom.xml file -

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>

Untuk pengguna Gradle, tambahkan dependensi di bawah ini dalam file build.gradle Anda

compile('org.springframework.cloud:spring-cloud-starter-zuul')

Untuk perutean Zuul, tambahkan properti di bawah ini ke file application.properties atau file application.yml.

spring.application.name = zuulserver
zuul.routes.products.path = /api/demo/**
zuul.routes.products.url = http://localhost:8080/
server.port = 8111

Ini berarti http memanggil /api/demo/diteruskan ke layanan produk. Sebagai contoh,/api/demo/products diteruskan ke /products.

pengguna file yaml dapat menggunakan file application.yml yang ditunjukkan di bawah ini -

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

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

Note - Itu http://localhost:8080/ aplikasi seharusnya sudah berjalan sebelum merutekan melalui Zuul Proxy.

File konfigurasi build lengkap diberikan di bawah ini.

Pengguna Maven dapat menggunakan file pom.xml yang diberikan di bawah ini -

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

Pengguna Gradle dapat menggunakan file build.gradle yang diberikan di bawah ini -

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

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot dengan menggunakan perintah Maven atau Gradle yang diberikan di bawah ini -

Untuk Maven, Anda dapat menggunakan perintah yang diberikan di bawah ini -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, Anda dapat menggunakan perintah yang diberikan di bawah ini -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah yang ditunjukkan di bawah ini -

java –jar <JARFILE>

Anda dapat menemukan aplikasi telah dimulai pada port Tomcat 8111 seperti yang ditunjukkan di sini.

Sekarang, tekan URL http://localhost:8111/api/demo/products di browser web Anda dan Anda dapat melihat output dari /products REST Endpoint seperti yang ditunjukkan di bawah ini -

Spring Cloud Configuration Server adalah aplikasi terpusat yang mengelola semua properti konfigurasi terkait aplikasi. Di bab ini, Anda akan mempelajari secara mendetail tentang cara membuat server Spring Cloud Configuration.

Membuat Server Konfigurasi Spring Cloud

Pertama, unduh proyek Spring Boot dari halaman Spring Initializer dan pilih ketergantungan Spring Cloud Config Server. Amati tangkapan layar yang diberikan di bawah ini -

Sekarang, tambahkan dependensi server Spring Cloud Config di file konfigurasi build Anda seperti yang dijelaskan di bawah -

Pengguna Maven dapat menambahkan ketergantungan di bawah ini ke dalam file pom.xml.

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-config-server</artifactId>
</dependency>

Pengguna Gradle dapat menambahkan dependensi di bawah ini dalam file build.gradle Anda.

compile('org.springframework.cloud:spring-cloud-config-server')

Sekarang, tambahkan anotasi @EnableConfigServer di file kelas aplikasi Spring Boot utama Anda. Anotasi @EnableConfigServer membuat aplikasi Spring Boot Anda bertindak sebagai Server Konfigurasi.

File kelas aplikasi Spring Boot utama diberikan di bawah ini -

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

Sekarang, tambahkan konfigurasi di bawah ini ke file properti Anda dan ganti file application.properties ke file bootstrap.properties. Perhatikan kode yang diberikan di bawah ini -

server.port = 8888
spring.cloud.config.server.native.searchLocations=file:///C:/configprop/
SPRING_PROFILES_ACTIVE=native

Server Konfigurasi berjalan pada port Tomcat 8888 dan properti konfigurasi aplikasi dimuat dari lokasi pencarian asli.

Sekarang di file:///C:/configprop/, tempatkan aplikasi klien Anda - file application.properties. Misalnya, nama aplikasi klien Anda adalahconfig-client, lalu ganti nama file application.properties Anda menjadi config-client.properties dan tempatkan file properti di jalur file:///C:/configprop/.

Kode untuk file properti config-client diberikan di bawah ini -

welcome.message = Welcome to Spring cloud config server

File konfigurasi build lengkap diberikan di bawah ini -

Pengguna Maven dapat menggunakan pom.xml diberikan di bawah -

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

Pengguna Gradle dapat menggunakan file build.gradle yang diberikan di bawah ini -

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

Sekarang, buat file JAR yang dapat dieksekusi, dan jalankan aplikasi Spring Boot menggunakan perintah Maven atau Gradle berikut -

Untuk Maven, gunakan perintah yang diberikan di bawah ini -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, gunakan perintah yang diberikan di bawah ini -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Jalankan file JAR dengan menggunakan perintah berikut -

java –jar <JARFILE>

Sekarang, aplikasi telah dimulai pada port Tomcat 8888 seperti yang ditunjukkan di sini -

Sekarang tekan URL http://localhost:8888/config-client/default/master di browser web Anda dan Anda dapat melihat properti konfigurasi aplikasi klien-config seperti yang ditunjukkan di sini.

Beberapa aplikasi mungkin memerlukan properti konfigurasi yang mungkin perlu diubah dan pengembang mungkin perlu menghapusnya atau memulai ulang aplikasi untuk melakukan ini. Namun, hal ini dapat menyebabkan waktu henti produksi dan kebutuhan untuk memulai ulang aplikasi. Spring Cloud Configuration Server memungkinkan pengembang memuat properti konfigurasi baru tanpa memulai ulang aplikasi dan tanpa waktu henti.

Bekerja dengan Server Konfigurasi Spring Cloud

Pertama, unduh proyek Spring Boot dari https://start.spring.io/dan pilih dependensi Klien Spring Cloud Config. Sekarang, tambahkan dependensi Spring Cloud Starter Config di file konfigurasi build Anda.

Pengguna Maven dapat menambahkan ketergantungan berikut ke dalam file pom.xml.

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

Pengguna Gradle dapat menambahkan dependensi berikut ke dalam build.gradle mengajukan.

compile('org.springframework.cloud:spring-cloud-starter-config')

Sekarang, Anda perlu menambahkan anotasi @RefreshScope ke aplikasi Spring Boot utama Anda. Anotasi @RefreshScope digunakan untuk memuat nilai properti konfigurasi dari server Config.

package com.example.configclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;

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

Sekarang, tambahkan URL server konfigurasi di file application.properties Anda dan berikan nama aplikasi Anda.

Note - http: // localhost: 8888 config server harus dijalankan sebelum memulai aplikasi klien config.

spring.application.name = config-client
spring.cloud.config.uri = http://localhost:8888

Kode untuk menulis REST Endpoint sederhana untuk membaca pesan selamat datang dari server konfigurasi diberikan di bawah ini -

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

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot dengan menggunakan perintah Maven atau Gradle berikut -

Untuk Maven, Anda dapat menggunakan perintah di bawah ini -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, Anda dapat menggunakan perintah yang ditunjukkan di bawah ini -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah yang ditunjukkan di sini:

java –jar <JARFILE>

Sekarang, aplikasi telah dimulai pada port Tomcat 8080 seperti yang ditunjukkan di sini -

Anda dapat melihat jendela konsol log in; aplikasi config-client sedang mengambil konfigurasi darihttps://localhost:8888

2017-12-08 12:41:57.682  INFO 1104 --- [           
   main] c.c.c.ConfigServicePropertySourceLocator : 
   Fetching config from server at: http://localhost:8888

Sekarang tekan URL, http://localhost:8080/ pesan selamat datang dimuat dari server Konfigurasi.

Sekarang, pergi dan ubah nilai properti pada server Konfigurasi dan tekan URL POST Endpoint aktuator http://localhost:8080/refresh dan melihat nilai properti konfigurasi baru di URL http://localhost:8080/

Spring Boot Actuator menyediakan titik akhir yang aman untuk memantau dan mengelola aplikasi Spring Boot Anda. Secara default, semua titik akhir aktuator diamankan. Dalam bab ini, Anda akan mempelajari secara detail tentang cara mengaktifkan aktuator Spring Boot ke aplikasi Anda.

Mengaktifkan Spring Boot Actuator

Untuk mengaktifkan titik akhir aktuator Spring Boot ke aplikasi Spring Boot Anda, kita perlu menambahkan ketergantungan aktuator Spring Boot Starter di file konfigurasi build kami.

Pengguna Maven dapat menambahkan dependensi di bawah ini ke file pom.xml Anda.

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

Pengguna Gradle dapat menambahkan dependensi di bawah ini dalam file build.gradle Anda.

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

Dalam file application.properties, kita perlu menonaktifkan keamanan untuk titik akhir aktuator.

management.security.enabled = false

Pengguna file YAML dapat menambahkan properti berikut di file application.yml Anda.

management:
   security:
      enabled: false

Jika Anda ingin menggunakan nomor port terpisah untuk mengakses titik akhir aktutator boot Spring, tambahkan nomor port manajemen di file application.properties.

management.port = 9000

Pengguna file YAML dapat menambahkan properti berikut di file application.yml Anda.

management:
   port: 9000

Sekarang, Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot dengan menggunakan perintah Maven atau Gradle berikut.

Untuk Maven, Anda dapat menggunakan perintah berikut -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, Anda dapat menggunakan perintah berikut -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, Anda dapat menjalankan file JAR dengan menggunakan perintah berikut -

java –jar <JARFILE>

Sekarang, aplikasi telah dimulai pada port Tomcat 8080. Perhatikan bahwa jika Anda menentukan nomor port manajemen, maka aplikasi yang sama berjalan pada dua nomor port yang berbeda.

Beberapa titik akhir penting Spring Boot Actuator diberikan di bawah ini. Anda dapat memasukkannya di browser web dan memantau perilaku aplikasi Anda.

TITIK AKHIR PEMAKAIAN
/ metrics Untuk melihat metrik aplikasi seperti memori yang digunakan, memori bebas, utas, kelas, uptime sistem, dll.
/ env Untuk melihat daftar variabel Lingkungan yang digunakan dalam aplikasi.
/kacang polong Untuk melihat kacang musim semi dan jenisnya, cakupan dan ketergantungannya.
/kesehatan Untuk melihat kesehatan aplikasi
/ info Untuk melihat informasi tentang aplikasi Spring Boot.
/jejak Untuk melihat daftar Jejak titik akhir Istirahat Anda.

Memantau aplikasi Anda dengan menggunakan Spring Boot Actuator Endpoint agak sulit. Karena, jika Anda memiliki jumlah 'n' aplikasi, setiap aplikasi memiliki titik akhir aktuator terpisah, sehingga membuat pemantauan menjadi sulit. Spring Boot Admin Server adalah aplikasi yang digunakan untuk mengelola dan memantau aplikasi Microservice Anda.

Untuk menangani situasi seperti itu, Tim CodeCentric menyediakan UI Admin Boot Musim Semi untuk mengelola dan memantau semua titik akhir Aktuator aplikasi Spring Boot Anda di satu tempat.

Untuk membangun Server Admin Spring Boot, kami perlu menambahkan dependensi di bawah ini ke file konfigurasi build Anda.

Pengguna Maven dapat menambahkan dependensi di bawah ini ke file pom.xml Anda -

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

Pengguna Gradle dapat menambahkan dependensi di bawah ini dalam file build.gradle Anda -

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'

Tambahkan anotasi @EnableAdminServer di file kelas aplikasi Spring Boot utama Anda. Anotasi @EnableAdminServer digunakan untuk menjadikan Anda sebagai Server Admin untuk memantau semua layanan mikro lainnya.

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

Sekarang, tentukan server.port dan nama aplikasi dalam file application.properties yang ditunjukkan -

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

Untuk pengguna YAML, gunakan properti berikut untuk menentukan nomor port dan nama aplikasi dalam file application.yml.

server:
   port: 9090
spring:
   application:
      name: adminserver

File konfigurasi build diberikan di bawah ini.

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

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot dengan menggunakan perintah Maven atau Gradle berikut -

Untuk Maven, gunakan perintah yang ditunjukkan di sini -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, gunakan perintah yang ditunjukkan di sini -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah yang diberikan di bawah ini -

java –jar <JARFILE>

Sekarang, aplikasi telah dimulai pada port Tomcat 9090 seperti yang ditunjukkan di sini -

Sekarang tekan URL di bawah ini dari browser web Anda dan lihat UI Server Admin.

http://localhost:9090/

Untuk memantau dan mengelola aplikasi layanan mikro melalui Server Admin Spring Boot, Anda harus menambahkan ketergantungan klien pemula Admin Boot Spring dan menunjukkan URI Server Admin ke dalam file properti aplikasi.

Note - Untuk memantau aplikasi, Anda harus mengaktifkan Titik Akhir Aktuator Boot Musim Semi untuk aplikasi Layanan Mikro Anda.

Pertama, tambahkan dependensi klien starter Spring Boot Admin berikut dan dependensi aktuator starter Spring Boot di file konfigurasi build Anda.

Pengguna Maven dapat menambahkan dependensi berikut di file pom.xml Anda -

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

Pengguna Gradle dapat menambahkan dependensi berikut dalam file build.gradle Anda.

compile group: 'de.codecentric', name: 'spring-boot-admin-starter-client', version: '1.5.5'
compile('org.springframework.boot:spring-boot-starter-actuator')

Sekarang, tambahkan URL Server Admin Spring Boot ke dalam file properti aplikasi Anda.

Untuk pengguna file properti, tambahkan properti berikut di file application.properties.

spring.boot.admin.url = http://localhost:9090/

Untuk pengguna YAML, tambahkan properti berikut di file application.yml.

spring:
   boot:
      admin:
         url: http://localhost:9000/

Sekarang, buat file JAR yang dapat dieksekusi, dan jalankan aplikasi Spring Boot dengan menggunakan perintah Maven atau Gradle berikut.

Untuk Maven, Anda dapat menggunakan perintah seperti yang ditunjukkan -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, Anda dapat menggunakan perintah seperti yang ditunjukkan -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah yang ditunjukkan -

java –jar <JARFILE>

Sekarang, aplikasi telah dimulai pada port Tomcat 9090 seperti yang ditunjukkan -

Sekarang tekan URL berikut dari browser web Anda dan lihat aplikasi Spring Boot Anda terdaftar dengan Spring Boot Admin Server.

http://localhost:9090/

Sekarang, klik Details dan melihat titik akhir aktuator di UI Server Admin.

Swagger2 adalah proyek open source yang digunakan untuk menghasilkan dokumen REST API untuk layanan web RESTful. Ini menyediakan antarmuka pengguna untuk mengakses layanan web RESTful kami melalui browser web.

Untuk mengaktifkan Swagger2 di aplikasi Spring Boot, Anda perlu menambahkan dependensi berikut di file konfigurasi build kami.

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

Untuk pengguna Gradle, tambahkan dependensi berikut di file build.gradle Anda.

compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.7.0'
compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.7.0'

Sekarang, tambahkan anotasi @ EnableSwagger2 di aplikasi Spring Boot utama Anda. Anotasi @ EnableSwagger2 digunakan untuk mengaktifkan Swagger2 untuk aplikasi Spring Boot Anda.

Kode untuk aplikasi Spring Boot utama ditunjukkan di bawah ini -

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

Selanjutnya, buat Docket Bean untuk mengonfigurasi Swagger2 untuk aplikasi Spring Boot Anda. Kita perlu menentukan paket dasar untuk mengonfigurasi REST API untuk Swagger2.

@Bean
   public Docket productApi() {
      return new Docket(DocumentationType.SWAGGER_2).select()
         .apis(RequestHandlerSelectors.basePackage("com.tutorialspoint.swaggerdemo")).build();
   }

Sekarang, tambahkan kacang ini di file kelas aplikasi Spring Boot utama itu sendiri dan kelas aplikasi Spring Boot utama Anda akan terlihat seperti yang ditunjukkan di bawah ini -

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

Sekarang, tambahkan dependensi Spring Boot Starter Web di bawah ini di file konfigurasi build Anda untuk menulis REST Endpoints seperti yang ditunjukkan di bawah ini -

Pengguna Maven dapat menambahkan dependensi berikut di file pom.xml Anda -

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

Pengguna Gradle dapat menambahkan dependensi berikut dalam file build.gradle -

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

Sekarang, kode untuk membangun dua layanan web RESTful sederhana GET dan POST dalam file Rest Controller ditampilkan di sini -

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

File konfigurasi build lengkap diberikan di bawah ini -

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

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot menggunakan perintah Maven atau Gradle berikut.

Untuk Maven, Anda dapat menggunakan perintah yang ditampilkan di sini -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, Anda dapat menggunakan perintah seperti yang ditunjukkan di sini -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah yang ditunjukkan di sini -

java –jar <JARFILE>

Sekarang, aplikasi akan mulai di port Tomcat 8080 seperti yang ditunjukkan -

Sekarang, tekan URL di browser web Anda dan lihat fungsi API Swagger.

http://localhost:8080/swagger-ui.html

Docker adalah layanan manajemen kontainer yang memudahkan pembangunan dan penerapan. Jika Anda seorang pemula di Docker, Anda dapat mempelajarinya secara detail di tautan ini -https://www.tutorialspoint.com/docker/index.htm

Di bab ini, kita akan melihat Cara membuat image Docker menggunakan dependensi Maven dan Gradle untuk aplikasi Spring Boot Anda.

Buat Dockerfile

Pertama, buat file dengan nama Dockerfile di bawah direktori src/main/dockerdengan konten yang ditunjukkan di bawah ini. Perhatikan bahwa file ini penting untuk membuat image 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

Untuk Maven, tambahkan plugin Docker Maven ke dalam file konfigurasi build Anda 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>

File pom.xml lengkap diberikan di bawah ini -

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

Sekarang, Anda dapat menjalankan aplikasi Anda dengan menggunakan perintah Maven mvn package docker:build

Note - Aktifkan daemon Expose tcp://localhost:2375 tanpa TLS.

Setelah build berhasil, Anda dapat melihat output di konsol seperti yang ditunjukkan di bawah ini -

Sekarang, lihat image Docker dengan perintah menggunakan image buruh pelabuhan dan lihat info image di konsol.

Gradle

Untuk membuat image Docker dengan menggunakan konfigurasi build Gradle, kita perlu menambahkan file docker plugin dan perlu menulis tugas buildDocker untuk membuat image Docker.

Kode untuk konfigurasi Gradle Docker diberikan di bawah ini.

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

File build.gradle lengkap diberikan di bawah ini.

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

Sekarang, buat image Docker dengan menggunakan perintah yang ditunjukkan di bawah ini -

gradle build buildDocker

Setelah menjalankan perintah, Anda dapat melihat log BUILD SUCCESSFUL di jendela konsol.

Sekarang, lihat gambar Docker dengan perintah menggunakan docker images dan lihat info gambar di konsol.

Sebagian besar pengembang menghadapi kesulitan dalam melacak log jika terjadi masalah. Ini dapat diselesaikan dengan server Spring Cloud Sleuth dan ZipKin untuk aplikasi Spring Boot.

Spring Cloud Sleuth

Log Spring cloud Sleuth dicetak dalam format berikut -

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

Dimana,

  • Application-name = Nama aplikasi

  • Traceid = setiap permintaan dan respons traceid sama saat memanggil layanan yang sama atau satu layanan ke layanan lain.

  • Spanid = Span Id dicetak bersama dengan Trace Id. Span Id berbeda setiap permintaan dan respon memanggil satu layanan ke layanan lain.

  • Zipkin-export = Secara default ini salah. Jika benar, log akan diekspor ke server Zipkin.

Sekarang, tambahkan dependensi Spring Cloud Starter Sleuth di file konfigurasi build Anda sebagai berikut -

Pengguna Maven dapat menambahkan dependensi berikut di file pom.xml Anda -

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

Pengguna Gradle dapat menambahkan dependensi berikut dalam file build.gradle Anda -

compile('org.springframework.cloud:spring-cloud-starter-sleuth')

Sekarang, tambahkan Log ke dalam file kelas Rest Controller aplikasi Spring Boot Anda seperti yang ditunjukkan di sini -

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

Sekarang, tambahkan nama aplikasi di file application.properties seperti yang ditunjukkan -

spring.application.name = tracinglogs

Kode lengkap untuk file konfigurasi build diberikan di bawah ini -

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

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot menggunakan perintah Maven atau Gradle berikut.

Untuk Maven, Anda dapat menggunakan perintah berikut -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, Anda dapat menggunakan perintah berikut -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah yang ditunjukkan di sini -

java –jar <JARFILE>

Sekarang, aplikasi telah dimulai pada port Tomcat 8080.

Sekarang, tekan URL di browser web Anda dan lihat hasilnya di log konsol.

http://localhost:8080/

Anda dapat melihat log berikut di jendela konsol. Perhatikan bahwa log dicetak dalam format berikut [application-name, traceid, spanid, zipkin-export]

Server Zipkin

Zipkin adalah aplikasi yang memantau dan mengelola log Spring Cloud Sleuth dari aplikasi Spring Boot Anda. Untuk membangun server Zipkin, kita perlu menambahkan dependensi Zipkin UI dan Zipkin Server di file konfigurasi build kita.

Pengguna Maven dapat menambahkan dependensi berikut di file pom.xml Anda -

<dependency>
   <groupId>io.zipkin.java</groupId>
   <artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
   <groupId>io.zipkin.java</groupId>
   <artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>

Pengguna Gradle dapat menambahkan dependensi di bawah ini dalam file build.gradle Anda -

compile('io.zipkin.java:zipkin-autoconfigure-ui')
compile('io.zipkin.java:zipkin-server')

Sekarang, konfigurasikan server.port = 9411 di file properti aplikasi.

Untuk pengguna file properti, tambahkan properti di bawah ini dalam file application.properties.

server.port = 9411

Untuk pengguna YAML, tambahkan properti di bawah ini dalam file application.yml.

server:
   port: 9411

Tambahkan anotasi @EnableZipkinServer di kelas aplikasi Spring Boot utama Anda. Anotasi @EnableZipkinServer digunakan untuk memungkinkan aplikasi Anda bertindak sebagai server 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);
   }
}

Kode untuk file konfigurasi build lengkap diberikan di bawah ini.

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

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot menggunakan perintah Maven atau Gradle di bawah ini -

Untuk Maven, gunakan perintah yang diberikan di bawah ini -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, gunakan perintah yang diberikan di bawah ini -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Jalankan file JAR dengan menggunakan perintah yang ditunjukkan -

java –jar <JARFILE>

Sekarang, aplikasi telah dimulai pada port Tomcat 9411 seperti yang ditunjukkan di bawah ini -

Sekarang, tekan URL di bawah dan lihat UI server Zipkin.

http://localhost:9411/zipkin/

Kemudian, tambahkan ketergantungan berikut di aplikasi layanan klien Anda dan tunjukkan URL Server Zipkin untuk melacak log layanan mikro melalui Zipkin UI.

Sekarang, tambahkan dependensi Spring Cloud Starter Zipkin di file konfigurasi build Anda seperti yang ditunjukkan -

Pengguna Maven dapat menambahkan ketergantungan berikut dalam file pom.xml -

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>

Pengguna Gradle dapat menambahkan dependensi di bawah ini dalam file build.gradle -

compile('org.springframework.cloud:spring-cloud-sleuth-zipkin')

Sekarang, tambahkan Always Sampler Bean di aplikasi Spring Boot Anda untuk mengekspor log ke server Zipkin.

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

Jika Anda menambahkan AlwaysSampler Bean, maka secara otomatis opsi Spring Sleuth Zipkin Export akan berubah dari false menjadi true.

Selanjutnya, konfigurasikan URL basis Server Zipkin Anda di file application.properties layanan klien.

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

Kemudian, berikan id pelacakan dan temukan jejaknya di Zipkin UI.

http://localhost:9411/zipkin/traces/{traceid}/

Flyway adalah aplikasi kontrol versi untuk mengembangkan skema Database Anda dengan mudah dan andal di semua instance Anda. Untuk mempelajari lebih lanjut tentang Flyway, Anda dapat menggunakan tautan - www.flywaydb.org

Banyak proyek perangkat lunak menggunakan database relasional. Ini membutuhkan penanganan migrasi database, juga sering disebut migrasi skema.

Dalam bab ini, Anda akan mempelajari secara detail tentang cara mengkonfigurasi database Flyway di aplikasi Spring Boot Anda.

Mengonfigurasi Database Jalur Terbang

Pertama, unduh proyek Spring Boot dari halaman Spring Initializer www.start.spring.io dan pilih dependensi berikut -

  • Web Pemula Boot Musim Semi
  • Flyway
  • MySQL
  • JDBC

Pengguna Maven dapat menambahkan dependensi berikut di file 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>

Pengguna Gradle dapat menambahkan dependensi berikut dalam file 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')

Di properti aplikasi, kita perlu mengkonfigurasi properti database untuk membuat DataSource dan juga properti jalur terbang yang perlu kita konfigurasi di properti aplikasi.

Untuk pengguna file properti, tambahkan properti di bawah ini di file 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

Pengguna YAML dapat menambahkan properti berikut di file 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"

Sekarang, buat file SQL di bawah src/main/resources/db/migrationdirektori. Beri nama file SQL sebagai "V1__Initial.sql"

CREATE TABLE USERS (ID INT AUTO_INCREMENT PRIMARY KEY, USERID VARCHAR(45));
INSERT INTO USERS (ID, USERID) VALUES (1, 'tutorialspoint.com');

Kode file kelas aplikasi Spring Boot utama diberikan di bawah ini -

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

File konfigurasi build lengkap diberikan di bawah ini.

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

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot dengan menggunakan perintah Maven atau Gradle yang diberikan di bawah ini -

Untuk Maven, Anda dapat menggunakan perintah yang ditampilkan di sini -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, Anda dapat menggunakan perintah yang ditampilkan di sini -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah berikut -

java –jar <JARFILE>

Sekarang, Tomcat mulai pada port 8080 dan di jendela konsol Anda dapat melihat log database jalur terbang seperti yang ditunjukkan di sini.

Anda sekarang bisa masuk ke database dan melakukan kueri pemilihan.

Dengan menggunakan layanan web Spring Boot RESTful, Anda dapat mengirim email dengan Gmail Transport Layer Security. Di bab ini, mari kita pahami secara detail cara menggunakan fitur ini.

Pertama, kita perlu menambahkan dependensi Spring Boot Starter Mail di file konfigurasi build Anda.

Pengguna Maven dapat menambahkan ketergantungan berikut ke dalam file pom.xml.

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

Pengguna Gradle dapat menambahkan dependensi berikut dalam file build.gradle Anda.

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

Kode file kelas aplikasi Spring Boot utama diberikan di bawah ini -

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

Anda dapat menulis Rest API sederhana untuk dikirim ke email dalam file kelas Rest Controller seperti yang ditunjukkan.

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

Anda dapat menulis metode untuk mengirim email dengan Lampiran. Tentukan properti mail.smtp dan gunakan PasswordAuthentication.

private void sendmail() throws AddressException, MessagingException, IOException {
   Properties props = new Properties();
   props.put("mail.smtp.auth", "true");
   props.put("mail.smtp.starttls.enable", "true");
   props.put("mail.smtp.host", "smtp.gmail.com");
   props.put("mail.smtp.port", "587");
   
   Session session = Session.getInstance(props, new javax.mail.Authenticator() {
      protected PasswordAuthentication getPasswordAuthentication() {
         return new PasswordAuthentication("[email protected]", "<your password>");
      }
   });
   Message msg = new MimeMessage(session);
   msg.setFrom(new InternetAddress("[email protected]", false));

   msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("[email protected]"));
   msg.setSubject("Tutorials point email");
   msg.setContent("Tutorials point email", "text/html");
   msg.setSentDate(new Date());

   MimeBodyPart messageBodyPart = new MimeBodyPart();
   messageBodyPart.setContent("Tutorials point email", "text/html");

   Multipart multipart = new MimeMultipart();
   multipart.addBodyPart(messageBodyPart);
   MimeBodyPart attachPart = new MimeBodyPart();

   attachPart.attachFile("/var/tmp/image19.png");
   multipart.addBodyPart(attachPart);
   msg.setContent(multipart);
   Transport.send(msg);   
}

Sekarang, panggil metode sendmail () di atas dari Rest API seperti yang ditunjukkan -

@RequestMapping(value = "/sendemail")
public String sendEmail() throws AddressException, MessagingException, IOException {
   sendmail();
   return "Email sent successfully";   
}

Note - Harap AKTIFKAN izinkan aplikasi yang kurang aman di setelan akun Gmail Anda sebelum mengirim email.

File konfigurasi build lengkap diberikan di bawah ini.

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

Sekarang, Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot dengan menggunakan perintah Maven atau Gradle yang ditunjukkan di bawah ini -

Untuk Maven, Anda dapat menggunakan perintah seperti yang ditunjukkan -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, Anda dapat menggunakan perintah seperti yang ditunjukkan -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah yang diberikan di bawah ini -

java –jar <JARFILE>

Anda dapat melihat bahwa aplikasi telah dimulai pada port Tomcat 8080.

Sekarang tekan URL berikut dari browser web Anda dan Anda akan menerima email.

http://localhost:8080/sendemail

Hystrix adalah perpustakaan dari Netflix. Hystrix mengisolasi titik akses di antara layanan, menghentikan kegagalan berjenjang di atasnya, dan menyediakan opsi fallback.

Sebagai contoh, ketika Anda menelepon 3 rd aplikasi pihak, dibutuhkan lebih banyak waktu untuk mengirim respon. Jadi pada saat itu, kontrol menuju ke metode fallback dan mengembalikan respons kustom ke aplikasi Anda.

Dalam bab ini Anda akan melihat Bagaimana mengimplementasikan Hystrix dalam aplikasi Spring Boot.

Pertama, kita perlu menambahkan dependensi Spring Cloud Starter Hystrix di file konfigurasi build kita.

Pengguna Maven dapat menambahkan dependensi berikut di file pom.xml -

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

Pengguna Gradle dapat menambahkan dependensi berikut dalam file build.gradle -

compile('org.springframework.cloud:spring-cloud-starter-hystrix')

Sekarang, tambahkan anotasi @EnableHystrix ke dalam file kelas aplikasi Spring Boot utama Anda. Anotasi @EnableHystrix digunakan untuk mengaktifkan fungsionalitas Hystrix ke dalam aplikasi Spring Boot Anda.

Kode file kelas aplikasi Spring Boot utama diberikan di bawah ini -

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

Sekarang tulis Rest Controller sederhana sehingga mengembalikan String setelah 3 detik dari waktu yang diminta.

@RequestMapping(value = "/")
public String hello() throws InterruptedException {
   Thread.sleep(3000);
   return "Welcome Hystrix";
}

Sekarang, tambahkan perintah @Hystrix dan @HystrixProperty untuk Rest API dan tentukan nilai batas waktu dalam milidetik.

@HystrixCommand(fallbackMethod = "fallback_hello", commandProperties = {
   @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
})

Selanjutnya, tentukan metode fallback fallback_hello () jika permintaan memerlukan waktu lama untuk merespons.

private String fallback_hello() {
   return "Request fails. It takes long time to response";
}

File kelas Rest Controller lengkap yang berisi REST API dan properti Hystrix ditampilkan di sini -

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

Dalam contoh ini, REST API ditulis dalam file kelas aplikasi Spring Boot itu sendiri.

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

File konfigurasi build lengkap diberikan di bawah ini.

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

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot dengan menggunakan perintah Maven atau Gradle berikut -

Untuk Maven, gunakan perintah seperti yang ditunjukkan -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, gunakan perintah seperti yang ditunjukkan -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah yang diberikan di bawah ini -

java –jar <JARFILE>

Ini akan memulai aplikasi pada port Tomcat 8080 seperti yang ditunjukkan di bawah ini -

Sekarang, tekan URL http://localhost:8080/dari browser web Anda, dan lihat respons Hystrix. API membutuhkan waktu 3 detik untuk merespons, tetapi batas waktu Hystrix adalah 1 detik.

Di bab ini, mari kita pahami cara membuat aplikasi web interaktif menggunakan Spring Boot dengan soket Web.

Untuk membangun aplikasi web interaktif di Spring Boot dengan soket Web, Anda perlu menambahkan dependensi berikut.

Pengguna Maven harus menambahkan dependensi berikut di file 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>

Pengguna Gradle dapat menambahkan dependensi berikut dalam file build.gradle Anda -

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

Mari kita buat pengontrol penanganan pesan untuk bekerja dengan pesan STOMP. Pesan STOMP dapat dirutekan ke file kelas @Controller. Misalnya, GreetingController dipetakan untuk menangani pesan ke tujuan “/ 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() + "!");
   }
}

Sekarang, konfigurasikan Spring untuk perpesanan STOMP. Tulis file kelas WebSocketConfig yang memperluas kelas AbstractWebSocketMessageBrokerConfigurer seperti yang ditunjukkan di bawah ini.

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

Anotasi @EnableWebSocketMessageBroker digunakan untuk mengkonfigurasi broker pesan soket Web untuk membuat titik akhir STOMP.

Anda dapat membuat file klien browser di bawah src / main / resources / static / index.html seperti yang ditunjukkan -

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

Mari kita buat file app.js untuk menggunakan dan menghasilkan pesan dengan menggunakan 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(); });
});

Kode untuk aplikasi Spring Boot utama ditunjukkan di bawah ini.

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

File konfigurasi build lengkap diberikan di bawah ini.

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

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot dengan menggunakan perintah Maven atau Gradle seperti yang ditunjukkan di bawah ini -

Untuk Maven, Anda dapat menggunakan perintah yang diberikan di bawah ini -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, Anda dapat menggunakan perintah seperti yang ditunjukkan -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Jalankan file JAR dengan menggunakan perintah yang diberikan di sini -

java –jar <JARFILE>

Sekarang, aplikasi telah dimulai pada port Tomcat 8080 seperti yang ditunjukkan.

Sekarang, tekan URL http://localhost:8080/ di browser web Anda dan hubungkan soket web dan kirim salam dan terima pesan.

Layanan Batch adalah proses untuk menjalankan lebih dari satu perintah dalam satu tugas. Dalam bab ini, Anda akan mempelajari cara membuat layanan batch dalam aplikasi Spring Boot.

Mari kita pertimbangkan contoh di mana kita akan menyimpan konten file CSV ke HSQLDB.

Untuk membuat program Batch Service, kita perlu menambahkan dependensi Spring Boot Starter Batch dan dependensi HSQLDB di file konfigurasi build kita.

Pengguna Maven dapat menambahkan dependensi berikut di file pom.xml.

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

Pengguna Gradle dapat menambahkan dependensi berikut dalam file build.gradle.

compile("org.springframework.boot:spring-boot-starter-batch")
compile("org.hsqldb:hsqldb")

Sekarang, tambahkan file data CSV sederhana di bawah classpath resource - src / main / resources dan beri nama file tersebut sebagai file.csv seperti yang ditunjukkan -

William,John
Mike, Sebastian
Lawarance, Lime

Selanjutnya, tulis skrip SQL untuk HSQLDB - di bawah direktori resource 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)
);

Buat kelas POJO untuk model PENGGUNA seperti yang ditunjukkan -

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

Sekarang, buat prosesor perantara untuk melakukan operasi setelah membaca data dari file CSV dan sebelum menulis data ke dalam 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;
   }
}

Mari kita buat file konfigurasi Batch, untuk membaca data dari CSV dan menulis ke dalam file SQL seperti yang ditunjukkan di bawah ini. Kita perlu menambahkan anotasi @EnableBatchProcessing di file kelas konfigurasi. Anotasi @EnableBatchProcessing digunakan untuk mengaktifkan operasi batch untuk aplikasi Spring Boot Anda.

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

Itu reader() metode digunakan untuk membaca data dari file CSV dan metode writer () digunakan untuk menulis data ke dalam SQL.

Selanjutnya, kita harus menulis kelas Pemroses Pemberitahuan Penyelesaian Pekerjaan - digunakan untuk memberi tahu setelah Pekerjaan selesai.

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

Sekarang, buat file JAR yang dapat dieksekusi, dan jalankan aplikasi Spring Boot dengan menggunakan perintah Maven atau Gradle berikut.

Untuk Maven, gunakan perintah seperti yang ditunjukkan -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, Anda dapat menggunakan perintah seperti yang ditunjukkan -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Jalankan file JAR dengan menggunakan perintah yang diberikan di sini -

java –jar <JARFILE>

Anda dapat melihat output di jendela konsol seperti yang ditunjukkan -

Apache Kafka adalah proyek sumber terbuka yang digunakan untuk menerbitkan dan berlangganan pesan berdasarkan sistem perpesanan yang toleran terhadap kesalahan. Ini cepat, dapat diskalakan, dan didistribusikan berdasarkan desain. Jika Anda seorang pemula di Kafka, atau ingin mendapatkan pemahaman yang lebih baik tentangnya, silakan merujuk ke tautan ini - www.tutorialspoint.com/apache_kafka/

Pada bab ini, kita akan melihat bagaimana mengimplementasikan Apache Kafka di aplikasi Spring Boot.

Pertama, kita perlu menambahkan dependensi Spring Kafka di file konfigurasi build kita.

Pengguna Maven dapat menambahkan dependensi berikut di file pom.xml.

<dependency>
   <groupId>org.springframework.kafka</groupId>
   <artifactId>spring-kafka</artifactId>
   <version>2.1.0.RELEASE</version>
</dependency>

Pengguna Gradle dapat menambahkan dependensi berikut dalam file build.gradle.

compile group: 'org.springframework.kafka', name: 'spring-kafka', version: '2.1.0.RELEASE'

Memproduksi Pesan

Untuk menghasilkan pesan ke Apache Kafka, kita perlu mendefinisikan kelas Konfigurasi untuk konfigurasi Producer seperti yang ditunjukkan -

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

Untuk mempublikasikan pesan, kawat otomatis objek Template Kafka dan buat pesan seperti yang ditunjukkan.

@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
 
public void sendMessage(String msg) {
   kafkaTemplate.send(topicName, msg);
}

Mengkonsumsi Pesan

Untuk menggunakan pesan, kita perlu menulis file kelas konfigurasi Konsumen seperti yang ditunjukkan di bawah ini.

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

Selanjutnya, tulis Pendengar untuk mendengarkan pesan.

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

Mari kita panggil metode sendMessage () dari metode menjalankan kelas ApplicationRunner dari file kelas aplikasi Spring Boot utama dan menggunakan pesan dari file kelas yang sama.

Kode file kelas aplikasi Spring Boot utama Anda diberikan di bawah ini -

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

Kode untuk file konfigurasi build lengkap diberikan di bawah ini.

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

Sekarang, buat file JAR yang dapat dieksekusi, dan jalankan aplikasi Spring Boot menggunakan perintah Maven atau Gradle di bawah ini seperti yang ditunjukkan -

Untuk Maven, gunakan perintah seperti yang ditunjukkan -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, gunakan perintah seperti yang ditunjukkan -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Jalankan file JAR dengan menggunakan perintah yang diberikan di sini -

java –jar <JARFILE>

Anda dapat melihat hasilnya di jendela konsol.

Twilio adalah 3 rd aplikasi pihak yang digunakan untuk mengirim SMS dan melakukan panggilan suara dari aplikasi kita. Ini memungkinkan kita untuk mengirim SMS dan membuat panggilan suara secara terprogram.

Pada bab ini, Anda akan belajar bagaimana mengimplementasikan pengiriman SMS dan melakukan panggilan suara dengan menggunakan Spring Boot dengan Twilio.

Note- Kami menggunakan akun Trail di Twilio untuk mengirim SMS dan melakukan panggilan suara. Anda dapat mempelajari lebih lanjut tentang Twilio di www.twilio.com .

Pertama, kita perlu menambahkan dependensi Twilio di file konfigurasi build kita.

Pengguna Maven dapat menambahkan dependensi berikut di file pom.xml.

<dependency>
   <groupId>com.twilio.sdk</groupId>
   <artifactId>twilio</artifactId>
   <version>7.16.1</version>
</dependency>

Pengguna Gradle dapat menambahkan dependensi berikut dalam file build.gradle.

compile group: "com.twilio.sdk", name:"twilio", version: "7.16.1"

Sekarang, inisialisasi akun Twilio dengan ACCOUNT_SID dan AUTH_ID di blok statis seperti yang ditunjukkan -

static {
   Twilio.init(ACCOUNT_SID, AUTH_ID);
}

Mengirim SMS

Untuk mengirim SMS, kita perlu menyediakan from-number dan to-number ke metode Message.create (). Isi isi pesan juga perlu kita sediakan untuk metode Message.creator () seperti yang ditunjukkan -

Message.creator(new PhoneNumber("to-number"), new PhoneNumber("from-number"),
   "Message from Spring Boot Application").create();

File kelas aplikasi Spring Boot utama terlihat di bawah.

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

Kode lengkap untuk membangun file konfigurasi diberikan di bawah ini -

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.+"   
}

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi spring boot dengan menggunakan perintah Maven atau Gradle berikut -

Untuk Maven, gunakan perintah seperti yang ditunjukkan -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, gunakan perintah seperti yang ditunjukkan -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Jalankan file JAR dengan menggunakan perintah seperti yang diberikan di bawah ini -

java –jar <JARFILE>

Sekarang, Anda akan menerima SMS ke "nomor ke" Anda.

Pesan diterima ke "to-number".

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

Note- Dalam contoh ini, kami menggunakan akun Trail. Jadi, Anda harus memverifikasi nomor tersebut sebelum mengirim SMS.

Panggilan suara

Untuk melakukan panggilan suara dengan menggunakan Twilio, kita perlu memanggil metode Call.creator (). Untuk metode ini, kita perlu menyediakan to-number, from-number, dan voice-note seperti yang ditunjukkan di sini.

Call.creator(new PhoneNumber("<to-number>"), new PhoneNumber("<from-number>"),
   new URI("http://demo.twilio.com/docs/voice.xml")).create();

Kode untuk file kelas aplikasi Spring Boot utama diberikan di bawah ini.

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

Kode untuk file konfigurasi build lengkap diberikan di bawah ini -

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.+"   
}

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot menggunakan perintah Maven atau Gradle berikut.

Untuk Maven, gunakan perintah seperti yang ditunjukkan -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, gunakan perintah seperti yang ditunjukkan -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah yang diberikan di sini -

java –jar <JARFILE>

Sekarang, Anda akan menerima panggilan ke "ke-nomor" Anda dari Twilio.

Tekan sembarang tombol setelah menghadiri panggilan, Anda akan mendengar catatan suara dari https://demo.twilio.com/docs/voice.xml

Note- Dalam contoh ini, kami menggunakan akun Trail. Jadi, Anda harus memverifikasi nomornya sebelum melakukan panggilan.

Pengujian Unit adalah salah satu pengujian yang dilakukan oleh pengembang untuk memastikan unit individu atau fungsi komponen berfungsi dengan baik.

Dalam tutorial ini, kita akan melihat bagaimana menulis kasus uji unit dengan menggunakan Mockito dan Web Controller.

Mockito

Untuk memasukkan Mockito Mocks ke Spring Beans, kita perlu menambahkan dependensi Mockito-core di file konfigurasi build kita.

Pengguna Maven dapat menambahkan dependensi berikut di file pom.xml Anda.

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

Pengguna Gradle dapat menambahkan dependensi berikut dalam file build.gradle.

compile group: 'org.mockito', name: 'mockito-core', version: '2.13.0'
testCompile('org.springframework.boot:spring-boot-starter-test')

Kode untuk menulis kelas Service yang berisi metode yang mengembalikan nilai String diberikan di sini.

package com.tutorialspoint.mockitodemo;

import org.springframework.stereotype.Service;

@Service
public class ProductService {
   public String getProductName() {
      return "Honey";
   } 
}

Sekarang, masukkan kelas ProductService ke dalam file kelas Layanan lain seperti yang ditunjukkan.

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

File kelas aplikasi Spring Boot utama diberikan di bawah ini -

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

Kemudian, konfigurasikan konteks Aplikasi untuk pengujian. Anotasi @Profile ("test") digunakan untuk mengonfigurasi kelas saat kasus Uji sedang berjalan.

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

Sekarang, Anda dapat menulis kasus Unit Test untuk Order Service di bawah src/test/resources paket.

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

Kode lengkap untuk file konfigurasi build diberikan di bawah ini.

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

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot menggunakan perintah Maven atau Gradle1 berikut.

Untuk Maven, Anda dapat menggunakan perintah seperti yang ditunjukkan -

mvn clean install

Anda dapat melihat hasil tes di jendela konsol.

Untuk Gradle, Anda dapat menggunakan perintah seperti yang ditunjukkan -

gradle clean build

Anda dapat melihat hasil sisanya di jendela konsol.

Spring Boot menyediakan cara mudah untuk menulis Tes Unit untuk file Rest Controller. Dengan bantuan SpringJUnit4ClassRunner dan MockMvc, kita dapat membuat konteks aplikasi web untuk menulis Unit Test for Rest Controller file.

Tes Unit harus ditulis di bawah src/test/java direktori dan sumber daya classpath untuk menulis pengujian harus ditempatkan di bawah src/test/resources direktori.

Untuk Menulis Tes Unit, kita perlu menambahkan dependensi Spring Boot Starter Test di file konfigurasi build Anda seperti yang ditunjukkan di bawah ini.

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

Pengguna Gradle dapat menambahkan dependensi berikut dalam file build.gradle Anda.

testCompile('org.springframework.boot:spring-boot-starter-test')

Sebelum menulis kasus Uji, pertama-tama kita harus membangun layanan web RESTful. Untuk informasi lebih lanjut tentang membangun layanan web RESTful, silakan merujuk ke bab yang sama yang diberikan dalam tutorial ini.

Menulis Tes Unit untuk REST Controller

Di bagian ini, mari kita lihat bagaimana menulis Tes Unit untuk REST Controller.

Pertama, kita perlu membuat file kelas Abstrak yang digunakan untuk membuat konteks aplikasi web dengan menggunakan MockMvc dan mendefinisikan metode mapToJson () dan mapFromJson () untuk mengubah objek Java menjadi string JSON dan mengubah string JSON menjadi objek 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);
   }
}

Selanjutnya, tulis file kelas yang memperluas kelas AbstractTest dan tulis Uji Unit untuk setiap metode seperti GET, POST, PUT, dan DELETE.

Kode untuk kasus GET API Test diberikan di bawah ini. API ini untuk melihat daftar produk.

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

Kode untuk kasus uji API POST diberikan di bawah ini. API ini untuk membuat produk.

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

Kode untuk kasus Uji PUT API diberikan di bawah ini. API ini untuk memperbarui produk yang sudah ada.

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

Kode untuk kasus Delete API Test diberikan di bawah ini. API ini akan menghapus produk yang sudah ada.

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

File kelas Tes Pengontrol lengkap diberikan di bawah ini -

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

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot dengan menggunakan perintah Maven atau Gradle yang diberikan di bawah ini -

Untuk Maven, Anda dapat menggunakan perintah yang diberikan di bawah ini -

mvn clean install

Sekarang, Anda dapat melihat hasil pengujian di jendela konsol.

Untuk Gradle, Anda dapat menggunakan perintah seperti yang ditunjukkan di bawah ini -

gradle clean build

Anda dapat melihat hasil sisanya di jendela konsol seperti gambar di bawah ini.

Spring Boot memberikan dukungan yang sangat baik untuk membuat Sumber Data untuk Database. Kami tidak perlu menulis kode tambahan untuk membuat Sumber Data di Spring Boot. Hanya menambahkan dependensi dan melakukan detail konfigurasi sudah cukup untuk membuat Sumber Data dan menghubungkan Database.

Dalam bab ini, kita akan menggunakan koneksi driver JDBC Spring Boot untuk menghubungkan database.

Pertama, kita perlu menambahkan dependensi JDBC Spring Boot Starter di file konfigurasi build kita.

Pengguna Maven dapat menambahkan dependensi berikut di file pom.xml.

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

Pengguna Gradle dapat menambahkan dependensi berikut dalam file build.gradle.

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

Hubungkan ke database H2

Untuk menghubungkan database H2, kita perlu menambahkan dependensi database H2 di file konfigurasi build kita.

Untuk pengguna Maven, tambahkan dependensi di bawah ini ke file pom.xml Anda.

<dependency>
   <groupId>com.h2database</groupId>
   <artifactId>h2</artifactId>
</dependency>

Untuk pengguna Gradle, tambahkan dependensi di bawah ini dalam file build.gradle Anda.

compile('com.h2database:h2')

Kita perlu membuat file schema.sql dan file data.sql di bawah direktori classpath src / main / resources untuk menghubungkan database H2.

File schema.sql diberikan di bawah ini.

CREATE TABLE PRODUCT (ID INT PRIMARY KEY, PRODUCT_NAME VARCHAR(25));

File data.sql diberikan di bawah ini.

INSERT INTO PRODUCT (ID,PRODUCT_NAME) VALUES (1,'Honey');
INSERT INTO PRODUCT (ID,PRODUCT_NAME) VALUES (2,'Almond');

Hubungkan MySQL

Untuk menghubungkan database MySQL, kita perlu menambahkan dependensi MySQL ke file konfigurasi build kita.

Untuk pengguna Maven, tambahkan dependensi berikut di file pom.xml Anda.

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
</dependency>

Untuk pengguna Gradle, tambahkan dependensi berikut di file build.gradle Anda.

compile('mysql:mysql-connector-java')

Sekarang, buat database dan tabel di MySQL seperti yang ditunjukkan -

Untuk pengguna file properti, tambahkan properti berikut di file 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

Untuk pengguna YAML, tambahkan properti berikut di file 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

Hubungkan Redis

Redis adalah database open source yang digunakan untuk menyimpan struktur data dalam memori. Untuk menghubungkan database Redis di aplikasi Spring Boot, kita perlu menambahkan dependensi Redis di file konfigurasi build kita.

Pengguna Maven harus menambahkan dependensi berikut di file pom.xml Anda.

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

Pengguna Gradle harus menambahkan dependensi berikut dalam file build.gradle Anda.

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

Untuk koneksi Redis, kita perlu menggunakan RedisTemplate. Untuk RedisTemplate, kami perlu memberikan detail 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;
}

Sekarang transfer otomatis kelas RedisTemplate dan akses data dari database Redis.

@Autowired

RedisTemplate<String, Object> redis;
Map<Object,Object> datalist = redis.opsForHash().entries(“Redis_code_index_key”);

Template JDBCT

Untuk mengakses Relational Database dengan menggunakan JdbcTemplate di aplikasi Spring Boot, kita perlu menambahkan dependensi JDBC Spring Boot Starter di file konfigurasi build kita.

Kemudian, jika Anda @Autowired kelas JdbcTemplate, Spring Boot secara otomatis menghubungkan Database dan menetapkan Sumber Data untuk objek JdbcTemplate.

@Autowired
JdbcTemplate jdbcTemplate;
Collection<Map<String, Object>> rows = jdbc.queryForList("SELECT QUERY");

Anotasi @Repository harus ditambahkan ke file kelas. Anotasi @Repositori digunakan untuk membuat repositori database untuk aplikasi Spring Boot Anda.

@Repository
public class ProductServiceDAO {
}

Beberapa Sumber Data

Kita dapat menyimpan 'n' number Datasources dalam satu aplikasi Spring Boot. Contoh yang diberikan di sini menunjukkan cara membuat lebih dari 1 sumber data di aplikasi Spring Boot. Sekarang, tambahkan dua detail konfigurasi sumber data di file properti aplikasi.

Untuk pengguna file properti, tambahkan properti berikut ke dalam file application.properties Anda.

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

Pengguna Yaml harus menambahkan properti berikut di file application.yml Anda.

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

Sekarang, buat kelas Konfigurasi untuk membuat DataSource dan JdbcTemplate untuk beberapa sumber data.

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

Kemudian, kawat otomatis objek template JDBCT dengan menggunakan anotasi @Qualifier.

@Qualifier("jdbcProductService")
@Autowired
JdbcTemplate jdbcTemplate;

@Qualifier("jdbcUserService")
@Autowired
JdbcTemplate jdbcTemplate;

Jika ketergantungan Spring Boot Security ditambahkan di classpath, aplikasi Spring Boot secara otomatis memerlukan Otentikasi Dasar untuk semua Titik Akhir HTTP. Endpoint “/” dan “/ home” tidak memerlukan otentikasi apa pun. Semua Endpoint lainnya memerlukan autentikasi.

Untuk menambahkan Spring Boot Security ke aplikasi Spring Boot Anda, kami perlu menambahkan ketergantungan Spring Boot Starter Security di file konfigurasi build kami.

Pengguna Maven dapat menambahkan dependensi berikut di file pom.xml.

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

Pengguna Gradle dapat menambahkan dependensi berikut dalam file build.gradle.

compile("org.springframework.boot:spring-boot-starter-security")

Mengamankan aplikasi Web

Pertama, buat aplikasi web yang tidak aman dengan menggunakan templat Thymeleaf.

Kemudian, buat file home.html di bawah src/main/resources/templates direktori.

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

Tampilan sederhana /hello didefinisikan dalam file HTML dengan menggunakan template Thymeleaf.

Sekarang, buat hello.html di bawah src/main/resources/templates direktori.

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

Sekarang, kita perlu mengatur Spring MVC - View controller untuk tampilan home dan hello.

Untuk ini, buat file konfigurasi MVC yang memperluas 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");
   }
}

Sekarang, tambahkan dependensi keamanan Spring Boot Starter ke file konfigurasi build Anda.

Pengguna Maven dapat menambahkan dependensi berikut di file pom.xml Anda.

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

Pengguna Gradle dapat menambahkan dependensi berikut dalam file build.gradle.

compile("org.springframework.boot:spring-boot-starter-security")

Sekarang, buat file Konfigurasi Keamanan Web, yang digunakan untuk mengamankan aplikasi Anda untuk mengakses Titik Akhir HTTP dengan menggunakan otentikasi dasar.

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

Sekarang, buat file login.html di bawah src/main/resources direktori untuk memungkinkan pengguna mengakses HTTP Endpoint melalui layar login.

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

Terakhir, perbarui file hello.html - untuk mengizinkan pengguna Keluar dari aplikasi dan menampilkan nama pengguna saat ini seperti yang ditunjukkan di bawah -

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

Kode untuk aplikasi Spring Boot utama diberikan di bawah ini -

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

Kode lengkap untuk file konfigurasi build diberikan di bawah ini.

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

Sekarang, buat file JAR yang dapat dieksekusi, dan jalankan aplikasi Spring Boot dengan menggunakan perintah Maven atau Gradle berikut.

Pengguna Maven dapat menggunakan perintah seperti yang diberikan di bawah ini -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Pengguna Gradle dapat menggunakan perintah seperti yang ditunjukkan -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah yang ditunjukkan di bawah ini -

java –jar <JARFILE>

Tekan URL http://localhost:8080/di browser web Anda. Anda dapat melihat hasilnya seperti yang ditunjukkan.

Dalam bab ini, Anda akan mempelajari secara mendetail tentang mekanisme Keamanan Boot Musim Semi dan OAuth2 dengan JWT.

Server Otorisasi

Server Otorisasi adalah komponen arsitektur tertinggi untuk Keamanan API Web. Server Otorisasi bertindak sebagai titik otorisasi sentralisasi yang memungkinkan aplikasi dan titik akhir HTTP Anda mengidentifikasi fitur aplikasi Anda.

Server Sumber Daya

Resource Server adalah aplikasi yang menyediakan token akses kepada klien untuk mengakses Titik Akhir HTTP Server Sumber Daya. Ini adalah kumpulan pustaka yang berisi Titik Akhir HTTP, sumber daya statis, dan halaman web Dinamis.

OAuth2

OAuth2 adalah kerangka kerja otorisasi yang memungkinkan Keamanan Web aplikasi mengakses sumber daya dari klien. Untuk membangun aplikasi OAuth2, kita perlu fokus pada Jenis Hibah (kode Otorisasi), ID Klien, dan rahasia Klien.

Token JWT

JWT Token adalah Token Web JSON, digunakan untuk mewakili klaim yang dijamin antara dua pihak. Anda dapat mempelajari lebih lanjut tentang token JWT di www.jwt.io/ .

Sekarang, kita akan membangun aplikasi OAuth2 yang memungkinkan penggunaan Server Otorisasi, Server Sumber Daya dengan bantuan Token JWT.

Anda dapat menggunakan langkah-langkah berikut untuk mengimplementasikan Spring Boot Security dengan token JWT dengan mengakses database.

Pertama, kita perlu menambahkan dependensi berikut di file konfigurasi build kita.

Pengguna Maven dapat menambahkan dependensi berikut di file pom.xml Anda.

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

Pengguna Gradle dapat menambahkan dependensi berikut dalam file 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")

dimana,

  • Spring Boot Starter Security - Menerapkan Keamanan Musim Semi

  • Spring Security OAuth2 - Menerapkan struktur OAUTH2 untuk mengaktifkan Server Otorisasi dan Server Sumber Daya.

  • Spring Security JWT - Menghasilkan Token JWT untuk keamanan Web

  • Spring Boot Starter JDBC - Mengakses database untuk memastikan pengguna tersedia atau tidak.

  • Spring Boot Starter Web - Menulis titik akhir HTTP.

  • H2 Database - Menyimpan informasi pengguna untuk otentikasi dan otorisasi.

File konfigurasi build lengkap diberikan di bawah ini.

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

Sekarang, di aplikasi Spring Boot utama, tambahkan anotasi @EnableAuthorizationServer dan @EnableResourceServer untuk bertindak sebagai server Auth dan Server Sumber Daya di aplikasi yang sama.

Selain itu, Anda dapat menggunakan kode berikut untuk menulis titik akhir HTTP sederhana untuk mengakses API dengan Keamanan Musim Semi dengan menggunakan Token JWT.

package com.tutorialspoint.websecurityapp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableAuthorizationServer
@EnableResourceServer
@RestController
public class WebsecurityappApplication {
   public static void main(String[] args) {
      SpringApplication.run(WebsecurityappApplication.class, args);
   }
   @RequestMapping(value = "/products")
   public String getProductName() {
      return "Honey";   
   }
}

Gunakan kode berikut untuk menentukan kelas POJO untuk menyimpan informasi Pengguna untuk otentikasi.

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

Sekarang, gunakan kode berikut dan tentukan kelas CustomUser yang memperluas kelas org.springframework.security.core.userdetails.User untuk otentikasi 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());
   }
}

Anda dapat membuat kelas @Repository untuk membaca informasi Pengguna dari database dan mengirimkannya ke layanan pengguna Kustom dan juga menambahkan otoritas yang diberikan "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;
   }
}

Anda bisa membuat kelas layanan detail Pengguna Kustom yang memperluas org.springframework.security.core.userdetails.UserDetailsService untuk memanggil kelas repositori DAO seperti yang ditunjukkan.

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

Selanjutnya, buat kelas @configuration untuk mengaktifkan Keamanan Web, tentukan pembuat kata sandi (BCryptPasswordEncoder), dan tentukan kacang AuthenticationManager. Kelas konfigurasi Keamanan harus memperluas kelas 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();
   }
}

Sekarang, tentukan kelas Konfigurasi OAuth2 untuk menambahkan ID Klien, Rahasia Klien, Tentukan JwtAccessTokenConverter, Kunci pribadi dan Kunci publik untuk kunci penandatangan token dan kunci pemverifikasi, dan konfigurasikan ClientDetailsServiceConfigurer untuk validitas Token dengan cakupan.

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

   }
}

Sekarang, buat kunci pribadi dan kunci publik dengan menggunakan openssl.

Anda dapat menggunakan perintah berikut untuk membuat kunci pribadi.

openssl genrsa -out jwt.pem 2048
openssl rsa -in jwt.pem

Anda dapat menggunakan Untuk pembuatan kunci publik menggunakan perintah di bawah ini.

openssl rsa -in jwt.pem -pubout

Untuk versi Spring Boot setelah rilis 1.5, tambahkan properti di bawah ini dalam file application.properties Anda untuk menentukan urutan filter Sumber Daya OAuth2.

security.oauth2.resource.filter-order=3

Pengguna file YAML dapat menambahkan properti di bawah ini dalam file YAML.

security:
   oauth2:
      resource:
         filter-order: 3

Sekarang, buat file schema.sql dan data.sql di bawah resource classpath src/main/resources/directory untuk menghubungkan aplikasi ke database H2.

File schema.sql seperti yang ditunjukkan -

CREATE TABLE USERS (ID INT PRIMARY KEY, USERNAME VARCHAR(45), PASSWORD VARCHAR(60));

File data.sql seperti yang ditunjukkan -

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 - Kata sandi harus disimpan dalam format Bcrypt Encoder di tabel database.

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot menggunakan perintah Maven atau Gradle berikut.

Untuk Maven, Anda dapat menggunakan perintah yang diberikan di bawah ini -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, Anda dapat menggunakan perintah seperti yang ditunjukkan -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah yang ditunjukkan di sini -

java –jar <JARFILE>

Aplikasi dimulai pada port Tomcat 8080.

Sekarang tekan URL metode POST melalui POSTMAN untuk mendapatkan token OAUTH2.

http://localhost:8080/oauth/token

Sekarang, tambahkan Header Permintaan sebagai berikut -

  • Authorization - Autentikasi Dasar dengan Id Klien dan rahasia Klien Anda.

  • Content Type - aplikasi / x-www-form-urlencoded

Sekarang, tambahkan Parameter Permintaan sebagai berikut -

  • grant_type = password
  • username = nama pengguna Anda
  • password = kata sandi Anda

Sekarang, tekan API dan dapatkan access_token seperti yang ditunjukkan -

Sekarang, Tekan Resource Server API dengan token akses Bearer di Request Header seperti yang ditunjukkan.

Kemudian Anda dapat melihat hasilnya seperti gambar di bawah ini -

Google Cloud Platform menyediakan layanan komputasi awan yang menjalankan aplikasi Spring Boot di lingkungan cloud. Dalam bab ini, kita akan melihat cara menerapkan aplikasi Spring Boot di platform mesin aplikasi GCP.

Pertama, unduh aplikasi Gradle build Spring Boot dari halaman Spring Initializer www.start.spring.io . Amati screenshot berikut.

Sekarang, di file build.gradle, tambahkan plugin appengine Google Cloud dan dependensi classpath appengine.

Kode untuk file build.gradle diberikan di bawah ini -

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

Sekarang, tulis HTTP Endpoint sederhana dan itu mengembalikan String sukses seperti yang ditunjukkan -

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

Selanjutnya, tambahkan file app.yml di bawah direktori src / main / appengine seperti yang ditunjukkan -

runtime: java
env: flex

handlers:
- url: /.*
   script: this field is required, but ignored

Sekarang, buka konsol Google Cloud dan klik Activate Google cloud shell di bagian atas halaman.

Sekarang, pindahkan file sumber dan file Gradle Anda ke direktori home mesin cloud google Anda dengan menggunakan google cloud shell.

Sekarang, jalankan perintah gradle appengineDeploy dan itu akan menerapkan aplikasi Anda ke appengine Google Cloud.

Note - GCP harus mengaktifkan penagihan dan sebelum menerapkan aplikasi Anda ke appengine, Anda harus membuat platform appengine di GCP.

Diperlukan beberapa menit untuk menerapkan aplikasi Anda ke dalam platform mesin aplikasi GCP.

Setelah build berhasil, Anda dapat melihat URL Layanan di jendela konsol.

Sekarang, tekan URL layanan dan lihat hasilnya.

Google Cloud SQL

Untuk menghubungkan Google Cloud SQL ke aplikasi Spring Boot, Anda harus menambahkan properti berikut ke file application.properties Anda.

Format 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 - Aplikasi Spring Boot dan Google Cloud SQL harus berada dalam project GCP yang sama.

File application.properties diberikan di bawah ini.

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

Pengguna file YAML dapat menambahkan properti di bawah ini ke file application.yml Anda.

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

Pada bab ini, kita akan melihat cara menambahkan Login dengan Google OAuth2 menggunakan aplikasi Spring Boot dengan Gradle build.

Pertama, tambahkan dependensi keamanan Spring Boot OAuth2 di file konfigurasi build Anda dan file konfigurasi build Anda diberikan di bawah ini.

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

Sekarang, tambahkan HTTP Endpoint untuk membaca User Principal dari Google setelah mengautentikasi melalui Spring Boot di file kelas aplikasi Spring Boot utama seperti yang diberikan di bawah ini -

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

Sekarang, tulis file Konfigurasi untuk mengaktifkan OAuth2SSO untuk keamanan web dan hapus otentikasi untuk file index.html seperti yang ditunjukkan -

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

Selanjutnya, tambahkan file index.html di bawah sumber daya statis dan tambahkan tautan untuk mengalihkan ke Titik Akhir HTTP pengguna untuk membaca Prinsipal pengguna Google seperti yang ditunjukkan di bawah ini -

<!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 - Di konsol Google Cloud - Aktifkan Layanan Gmail, Layanan Analytics, dan API layanan Google+.

Kemudian, buka bagian Kredensial dan buat kredensial dan pilih ID Klien OAuth.

Selanjutnya, berikan Nama Produk di layar persetujuan OAuth2.

Selanjutnya, pilih Jenis Aplikasi sebagai "Aplikasi web", berikan asal JavaScript Resmi dan URI pengalihan Resmi.

Sekarang, Id Klien dan Rahasia Klien OAuth2 Anda dibuat.

Selanjutnya, tambahkan Id Klien dan Rahasia Klien di file properti aplikasi Anda.

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

Sekarang, Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot dengan menggunakan perintah Gradle berikut.

Untuk Gradle, Anda dapat menggunakan perintah seperti yang ditunjukkan -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Jalankan file JAR dengan menggunakan perintah java –jar <JARFILE> dan aplikasi dijalankan pada port Tomcat 8080.

Sekarang tekan URL http://localhost:8080/ dan klik link Login Google.

Ini akan mengarahkan ke layar login Google dan memberikan detail login Gmail.

Jika login berhasil, kami akan menerima objek Principal dari pengguna Gmail.