开发手册 欢迎您!
软件开发者资料库

Spring Boot - 异常处理

Spring Boot异常处理 - 从基本到高级概念的简单简单步骤学习Spring Boot,其中包括简介,快速入门,Bootstrapping,Tomcat部署,构建系统,代码结构,Spring Bean和依赖注入,Runners,应用程序属性,日志记录等示例,构建RESTful Web服务,异常处理,拦截器,Servlet过滤器,Tomcat端口号,Rest模板,文件处理,服务组件,Thymeleaf,使用RESTful Web服务,CORS支持,国际化,调度,启用HTTPS,Eureka服务器,服务注册Eureka,Zuul代理服务器和路由,Spring云配置服务器,Spring云配置客户端,执行器,管理服务器,管理客户端,启用Swagger2,创建Docker镜像,跟踪微服务日志,Flyway数据库,发送电子邮件,Hystrix,Web套接字,批处理服务,Apache Kafka的Spring,Twilio,单元测试用例,休息控制器单元测试,数据库处理,安全Web应用程序,带有JWT的OAuth2,Google云平台,Google OAuth2登录。

处理API中的异常和错误并向客户端发送正确的响应对企业应用程序有利.在本章中,我们将学习如何处理Spring Boot中的异常.

在继续进行异常处理之前,让我们了解以下注释.

控制器建议

@ControllerAdvice是一个注释,用于全局处理异常.

异常处理程序

@ExceptionHandler是一个注释,用于处理特定异常并将自定义响应发送到客户端.

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

package com.it1352.demo.exception; import org.springframework.web.bind.annotation.ControllerAdvice;@ControllerAdvice   public class ProductExceptionController {}

定义一个扩展RuntimeException类的类.

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

您可以定义@ExceptionHandler方法来处理异常,如图所示.此方法应该用于编写Controller Advice类文件.

@ExceptionHandler(value = ProductNotfoundException.class)public ResponseEntity exception(ProductNotfoundException exception) {}

现在,使用下面给出的代码从API中抛出异常.

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

下面给出了处理异常的完整代码.在此示例中,我们使用PUT API更新产品.此处,在更新产品时,如果未找到产品,则将响应错误消息返回为"未找到产品".请注意, ProductNotFoundException 异常类应该扩展 RuntimeException .

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

下面给出了全局处理异常的Controller Advice类.我们可以在这个类文件中定义任何Exception Handler方法.

package com.it1352.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;@ControllerAdvicepublic class ProductExceptionController {   @ExceptionHandler(value = ProductNotfoundException.class)   public ResponseEntity exception(ProductNotfoundException exception) {      return new ResponseEntity<>("Product not found", HttpStatus.NOT_FOUND);   }}

下面给出了Product Service API控制器文件以更新产品.如果找不到产品,则会抛出 ProductNotFoundException 类.

package com.it1352.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.it1352.demo.exception.ProductNotfoundException;import com.it1352.demo.model.Product;@RestControllerpublic class ProductServiceController {   private static Map 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 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.it1352.demo; import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class DemoApplication {   public static void main(String[] args) {      SpringApplication.run(DemoApplication.class, args);   }}

产品的 POJO类代码低于 :

package com.it1352.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 的代码如下所示 :

      4.0.0   com.it1352   demo   0.0.1-SNAPSHOT   jar   demo   Demo project for Spring Boot         org.springframework.boot      spring-boot-starter-parent      1.5.8.RELEASE                   UTF-8      UTF-8      1.8                     org.springframework.boot         spring-boot-starter-web                     org.springframework.boot         spring-boot-starter-test         test                                       org.springframework.boot            spring-boot-maven-plugin                     

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.it1352'version = '0.0.1-SNAPSHOT'sourceCompatibility = 1.8repositories {   mavenCentral()}dependencies {   compile('org.springframework.boot:spring-boot-starter-web')   testCompile('org.springframework.boot:spring-boot-starter-test')}

您可以创建可执行的JAR文件,并使用Maven或Gradl运行Spring Boot应用程序e命令 :

对于Maven,您可以使用以下命令 :

mvn clean install

在"BUILD SUCCESS"之后,你可以在目标目录下找到JAR文件.

对于Gradle,你可以使用以下命令 :

gradle clean build

之后"BUILD SUCCESSFUL",您可以在build/libs目录下找到JAR文件.

您可以使用以下命令运行JAR文件 :

 java - jar 

这将在Tomcat端口8080上启动应用程序,如下所示 :

异常处理Tomcat应用程序启动

现在在POSTMAN应用程序中点击以下URL,你可以看到输出如下所示 :

更新网址:http://localhost:8080/products/3

邮递员申请表更新网址

2009-2025 Copyright Wonhero.Com All Rights Reserved
深圳幻海软件技术有限公司 版权所有