美文网首页
Spring Boot 教程:异常处理

Spring Boot 教程:异常处理

作者: 码者无疆 | 来源:发表于2020-08-24 00:58 被阅读0次

    【注】本文译自: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

    相关文章

      网友评论

          本文标题:Spring Boot 教程:异常处理

          本文链接:https://www.haomeiwen.com/subject/ohrgjktx.html