springboot异常处理、异步执行&整合第三方插件

一、SpringBoot全局异常处理

  1. 创建一个基本的springboot项目

  2. 编写一个简单地请求,然后在请求方法里写一个逻辑错误代码

    package com.tcc.controller;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class UserController {
    	
    	@RequestMapping("test")
    	public Object test() {
    		int n = 1/0; // 0不能做除数,所以肯定会报错
    		return "测试成功";
    	}
    
    }
    
  3. 运行项目,查看页面报错

    在这里插入图片描述

  4. 编写全局异常的处理类,添加注解,如下:

    package com.tcc.handler;
    
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @ControllerAdvice
    public class GlobalExceptionHandler {
    	
    	@ExceptionHandler(RuntimeException.class)
    	@ResponseBody
    	public String exceptionHandler() {
    		return "error";
    	}
    
    }
    
  5. 添加完以后重启项目再次访问页面查看是否报错,结果如下:

    在这里插入图片描述

其中涉及到的注解含义及用法如下 :

  • @ControllerAdvice:该注解是 spring2.3 以后新增的一个注解,主要是用来为 Controller 的一些公共需 求的低侵入性增强提供辅助,作用于@RequestMapping 标注的方法上。
  • @ExceptionHandler:该注解是配合@ControllerAdvice 一起使用的注解,可以自定义错误处理器,自行 组装 json 字符串,并返回到页面。

注意: 如果想实现不同的异常有不同的操作的话,只需要将 @ExceptionHandler 的 value 的值不一样就 可以了,可以同时实现多个不同的异常处理,但不能出现包含状态。

全局异常捕获的原理是: 使用 AOP技术,采用异常通知的方式处理。

二、SpringBoot异步执行

  1. 创建一个简单的springboot项目

  2. 创建一个task任务类

    package com.tcc.task;
    
    import org.springframework.scheduling.annotation.Async;
    import org.springframework.stereotype.Component;
    
    @Component
    public class MyTask {
    	
        @Async
    	public String say() {
    		try {
    			Thread.sleep(5000); // 程序睡眠5秒后再执行
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		} 
    		System.out.println("刚睡了5秒,醒了");
    		return "say";
    	}
    
    }
    
  3. 编写controller调用任务类

    package com.tcc.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.tcc.task.MyTask;
    
    @RestController
    public class SayController {
    	@Autowired
    	private MyTask task;
    	
    	@RequestMapping("test")
    	public String say() {
    		task.say(); //异步方法,这个方法不影响下面程序的正常执行
    		System.out.println("控制层输出");
    		return "欢迎使用springboot";
    	}
    	
    }
    
  4. 主方法上加上@EnableAsync注解

    package com.tcc;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.scheduling.annotation.EnableAsync;
    
    @EnableAsync
    @SpringBootApplication
    public class App {
    
    	public static void main(String[] args) {
    		SpringApplication.run(App.class, args);
    	}
    
    }
    

解释:

  • 当没有添加@Async和@EnableAsync注解时,这就是个普通的方法,当发起请求时,请求里的方法就会等task.say()方法执行完毕以后再执行下面的语句。

  • 当添加这两个注解以后,task.say()方法就会变成异步方法,当发起请求时,请里的方法不管task.say()方法是否执行完毕,下面的方法都会正常执行。

三、SpringBoot整合Lombok

  1. 去官网下载lombok.jar包,官网: Download (projectlombok.org)

  2. 打开lombok.jar所在的文件夹,按住shift+鼠标右键,选择->在此处打开powershell窗口

  3. 在窗口中写入java -jar lombok.jar点击回车

    在这里插入图片描述

  4. 一般的都会自动扫描到软件然后点击Install/Update按钮安装

    • 如果没有扫描到,则点击specify location...按钮

      在这里插入图片描述

  5. 选择以后点击安装

  6. 安装成功以后,点击右下角退出

    在这里插入图片描述

  7. 重启sts软件

  8. 创建一个简单的springboot项目,然后导入lombok依赖。

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    
  9. 创建简单的实体类,然后添加lombok注解

    package com.tcc.entity;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class User {
    	private int id;
    	private String name;
    	private String sex;
    	private int age;
    }
    
  10. 通过查看Outline查看是否自动添加了方法

    在这里插入图片描述

lombok的常用注解:

在这里插入图片描述

四、SpringBoot整合Swagger2

  1. 添加依赖

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.6.1</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.6.1</version>
    </dependency>
    
  2. 创建一个基本的spring,添加一个简单的业务

  3. 在启动类中添加@EnableSwagger2注解

  4. 在controller中添加api注解

    package com.tcc.controller;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.tcc.entity.User;
    
    import io.swagger.annotations.Api;
    import io.swagger.annotations.ApiOperation;
    import io.swagger.annotations.ApiParam;
    
    @Api //修饰整个类,描述 Controller 的作用
    @RestController
    public class UserController {
    	
    	@ApiOperation("根据用户id获取用户") //描述一个类的一个方法,或者说一个接口
    	@RequestMapping("getUserById")
    	public Object getUserById(@ApiParam("用户id")int id) { //单个参数描述0
    		User user = new User(id, "张三");
    		return user;
    	}
    
    }
    
  5. 启动项目,访问: http://localhost:8080/swagger-ui.html

常用注解

  • @Api:修饰整个类,描述 Controller 的作用
  • @ApiOperation:描述一个类的一个方法,或者说一个接口
  • @ApiParam:单个参数描述
  • @ApiModel:用对象来接收参数
  • @ApiProperty:用对象接收参数时,描述对象的一个字段
  • @ApiResponse:HTTP 响应其中1个描述
  • @ApiResponses:HTTP 响应整体描述
  • @ApiIgnore:使用该注解忽略这个 API
  • @ApiImplicitParam:一个请求参数
  • @ApiError :发生错误返回的信息
  • @ApiImplicitParams:多个请求参数

版权声明:本文为qq_57404736原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。