Spring Boot - Xử lý ngoại lệ

Xử lý các ngoại lệ và lỗi trong API và gửi phản hồi thích hợp đến máy khách là điều tốt cho các ứng dụng doanh nghiệp. Trong chương này, chúng ta sẽ học cách xử lý các ngoại lệ trong Spring Boot.

Trước khi tiếp tục xử lý ngoại lệ, chúng ta hãy hiểu về các chú thích sau.

Lời khuyên của người điều khiển

@ControllerAdvice là một chú thích, để xử lý các ngoại lệ trên toàn cầu.

Xử lý ngoại lệ

@ExceptionHandler là một chú thích được sử dụng để xử lý các ngoại lệ cụ thể và gửi các phản hồi tùy chỉnh cho máy khách.

Bạn có thể sử dụng mã sau để tạo lớp @ControllerAdvice để xử lý các ngoại lệ trên toàn cầu -

package com.tutorialspoint.demo.exception;

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

@ControllerAdvice
   public class ProductExceptionController {
}

Định nghĩa một lớp mở rộng lớp RuntimeException.

package com.tutorialspoint.demo.exception;

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

Bạn có thể xác định phương thức @ExceptionHandler để xử lý các ngoại lệ như được hiển thị. Phương thức này nên được sử dụng để ghi tệp lớp Tư vấn bộ điều khiển.

@ExceptionHandler(value = ProductNotfoundException.class)

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

Bây giờ, hãy sử dụng mã được cung cấp bên dưới để loại bỏ ngoại lệ khỏi API.

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

Mã hoàn chỉnh để xử lý ngoại lệ được đưa ra bên dưới. Trong ví dụ này, chúng tôi đã sử dụng API PUT để cập nhật sản phẩm. Tại đây, trong khi cập nhật sản phẩm, nếu sản phẩm không được tìm thấy, thì trả về thông báo lỗi phản hồi là “Không tìm thấy sản phẩm”. Lưu ý rằngProductNotFoundException lớp ngoại lệ nên mở rộng RuntimeException.

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

Lớp Tư vấn Bộ điều khiển để xử lý ngoại lệ trên toàn cầu được đưa ra bên dưới. Chúng ta có thể xác định bất kỳ phương thức xử lý ngoại lệ nào trong tệp lớp này.

package com.tutorialspoint.demo.exception;

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

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

Tệp trình điều khiển API Dịch vụ Sản phẩm được cung cấp bên dưới để cập nhật Sản phẩm. Nếu Sản phẩm không được tìm thấy, thì nó sẽ némProductNotFoundException lớp học.

package com.tutorialspoint.demo.controller;

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

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

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

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

Mã cho tệp lớp ứng dụng Spring Boot chính được cung cấp bên dưới:

package com.tutorialspoint.demo;

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

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

Mã cho POJO class cho Sản phẩm được đưa ra bên dưới -

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

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

Mã cho Maven build – pom.xml được hiển thị bên dưới -

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

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

   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <java.version>1.8</java.version>
   </properties>

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

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

Mã cho Gradle Build – build.gradle được đưa ra dưới đây -

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

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

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

Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng lệnh Maven hoặc Gradle -

Đối với Maven, bạn có thể sử dụng lệnh sau:

mvn clean install

Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.

Đối với Gradle, bạn có thể sử dụng lệnh sau:

gradle clean build

Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.

Bạn có thể chạy tệp JAR bằng cách sử dụng lệnh sau:

java –jar <JARFILE>

Thao tác này sẽ khởi động ứng dụng trên cổng Tomcat 8080 như hình dưới đây -

Bây giờ, hãy nhấn vào URL bên dưới trong ứng dụng POSTMAN và bạn có thể thấy kết quả như hình dưới đây -

Cập nhật URL: http: // localhost: 8080 / products / 3