Spring Boot 教程:异常处理

【注】本文译自:https://www.tutorialspoint.com/spring_boot/spring_boot_exception_handling.htm

    对于企业应用而言,在 API 中处理好异常和错误是至关重要的。本文将带你学习如果在 Spring Boot 中处理异常。

    在学习异常处理前让我们先来理解下面的注解:

Controller Advice

    @ControllerAdvice 注解用于处理全局异常。

Exception Handler

    @ExceptionHandler 注解是用于处理指定的异常并向客户端发送一个自定义的响应。

    可以使用下面的代码来创建 @ControllerAdvice 类以处理全局异常:

package com.tutorialspoint.demo.exception;

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

@ControllerAdvice

   public class ProductExceptionController {

}

    定义一个继承 RuntimeException 的类。

package com.tutorialspoint.demo.exception;

public class ProductNotfoundException extends RuntimeException {

   private static final long serialVersionUID = 1L;

}

    如下所示,可以定义 @ExceptionHandler 方法来处理异常。这个方法应当被用于编写 Controller Advice 类文件。

@ExceptionHandler(value = ProductNotfoundException.class)

public ResponseEntity<Object> exception(ProductNotfoundException exception) {

}

    现在,使用以下代码来抛出来自 API 的异常:

@RequestMapping(value = "/products/{id}", method = RequestMethod.PUT)

public ResponseEntity<Object> updateProduct() {

   throw new ProductNotfoundException();

}

    完整的异常处理代码如下所示。在这个例子中,我们使用 PUT API 来更新产品。当更新产品时,如果找不到产品,返回的响应消息是 “Product not found”。注意 ProductNotFoundException 异常类应当继承 RuntimeException

package com.tutorialspoint.demo.exception;

public class ProductNotfoundException extends RuntimeException {

   private static final long serialVersionUID = 1L;

}

    Controller Advice 类处理全局异常,如下所示。我们可以在这个类文件中定义任何 Exception Handler 方法。

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

   }

}

    下面的 Product Service API controller 文件更新产品。如果产品不存在,就抛出 ProductNotFoundException 类。

package com.tutorialspoint.demo.controller;



import java.util.HashMap;

import java.util.Map;



import org.springframework.http.HttpStatus;

import org.springframework.http.ResponseEntity;

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

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

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

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

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



import com.tutorialspoint.demo.exception.ProductNotfoundException;

import com.tutorialspoint.demo.model.Product;



@RestController

public class ProductServiceController {

   private static Map<String, Product> productRepo = new HashMap<>();

   static {

      Product honey = new Product();

      honey.setId("1");

      honey.setName("Honey");

      productRepo.put(honey.getId(), honey);

      

      Product almond = new Product();

      almond.setId("2");

      almond.setName("Almond");

      productRepo.put(almond.getId(), almond);

   }

   

   @RequestMapping(value = "/products/{id}", method = RequestMethod.PUT)

   public ResponseEntity<Object> updateProduct(@PathVariable("id") String id, @RequestBody Product product) {

      if(!productRepo.containsKey(id))throw new ProductNotfoundException();

      productRepo.remove(id);

      product.setId(id);

      productRepo.put(id, product);

      return new ResponseEntity<>("Product is updated successfully", HttpStatus.OK);

   }

}

    主 Spring Boot 应用类文件如下:

package com.tutorialspoint.demo;



import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;



@SpringBootApplication

public class DemoApplication {

   public static void main(String[] args) {

      SpringApplication.run(DemoApplication.class, args);

   }

}

    产品 POJO 类 如下:

package com.tutorialspoint.demo.model;

public class Product {

   private String id;

   private String name;



   public String getId() {

      return id;

   }

   public void setId(String id) {

      this.id = id;

   }

   public String getName() {

      return name;

   }

   public void setName(String name) {

      this.name = name;

   }

}

    Maven build – pom.xml 代码如下所示:

<?xml version = "1.0" encoding = "UTF-8"?>

<project xmlns = "http://maven.apache.org/POM/4.0.0"

   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"

   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0

   http://maven.apache.org/xsd/maven-4.0.0.xsd">

   

   <modelVersion>4.0.0</modelVersion>

   <groupId>com.tutorialspoint</groupId>

   <artifactId>demo</artifactId>

   <version>0.0.1-SNAPSHOT</version>

   <packaging>jar</packaging>

   <name>demo</name>

   <description>Demo project for Spring Boot</description>



   <parent>

      <groupId>org.springframework.boot</groupId>

      <artifactId>spring-boot-starter-parent</artifactId>

      <version>1.5.8.RELEASE</version>

      <relativePath/>

   </parent>



   <properties>

      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

      <java.version>1.8</java.version>

   </properties>



   <dependencies>

      <dependency>

         <groupId>org.springframework.boot</groupId>

         <artifactId>spring-boot-starter-web</artifactId>

      </dependency>

      <dependency>

         <groupId>org.springframework.boot</groupId>

         <artifactId>spring-boot-starter-test</artifactId>

         <scope>test</scope>

      </dependency>

   </dependencies>



   <build>

      <plugins>

         <plugin>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-maven-plugin</artifactId>

         </plugin>

      </plugins>

   </build>

   

</project>

    Gradle Build – build.gradle 代码如下:

buildscript {

   ext {

      springBootVersion = '1.5.8.RELEASE'

   }

   repositories {

      mavenCentral()

   }

   dependencies {

      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")

   }

}

apply plugin: 'java'

apply plugin: 'eclipse'

apply plugin: 'org.springframework.boot'



group = 'com.tutorialspoint'

version = '0.0.1-SNAPSHOT'

sourceCompatibility = 1.8



repositories {

   mavenCentral()

}

dependencies {

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

   testCompile('org.springframework.boot:spring-boot-starter-test')

}

    你可以使用 Maven 或 Gradle 命令构建 JAR 并运行 Spring Boot 应用:

    Maven 命令如下:

mvn clean install

    “BUILD SUCCESS” 之后,你可以在 target 目录下找到 JAR 文件。

    Gradle 可以使用如下命令:

gradle clean build

    “BUILD SUCCESSFUL” 后,你可以在 build/libs 目录下找到 JAR 文件。

    你可以使用下面的命令运行 JAR 文件。

java –jar <JARFILE>

    在 Tomcat 8080 端口启动应用,如下所示:

    现在,在 POSTMAN 应用中单击下面的 URL,你可以看到如下输出:

    更新 URL: http://localhost:8080/products/3

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值