一、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 "测试成功";
	}

}
  1. 运行项目,查看页面报错
  2. 编写全局异常的处理类,添加注解,如下:
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";
	}

}
  1. 添加完以后重启项目再次访问页面查看是否报错,结果如下:

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

  • @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";
	}

}
  1. 编写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";
	}
	
}
  1. 主方法上加上@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...按钮
  1. 选择以后点击安装
  2. 安装成功以后,点击右下角退出
  3. 重启sts软件
  4. 创建一个简单的springboot项目,然后导入lombok依赖。
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
  1. 创建简单的实体类,然后添加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;
}
  1. 通过查看Outline查看是否自动添加了方法

lombok的常用注解:

springboot异步获取结果 springboot异步处理_spring boot

四、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>
  1. 创建一个基本的spring,添加一个简单的业务
  2. 在启动类中添加@EnableSwagger2注解
  3. 在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;
	}

}
  1. 启动项目,访问: http://localhost:8080/swagger-ui.html

常用注解

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