一、SpringBoot全局异常处理
- 创建一个基本的springboot项目
- 编写一个简单地请求,然后在请求方法里写一个逻辑错误代码
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 "测试成功";
}
}
- 运行项目,查看页面报错
- 编写全局异常的处理类,添加注解,如下:
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";
}
}
- 添加完以后重启项目再次访问页面查看是否报错,结果如下:
其中涉及到的注解含义及用法如下 :
- @ControllerAdvice:该注解是 spring2.3 以后新增的一个注解,主要是用来为 Controller 的一些公共需 求的低侵入性增强提供辅助,作用于@RequestMapping 标注的方法上。
- @ExceptionHandler:该注解是配合@ControllerAdvice 一起使用的注解,可以自定义错误处理器,自行 组装 json 字符串,并返回到页面。
注意: 如果想实现不同的异常有不同的操作的话,只需要将 @ExceptionHandler 的 value 的值不一样就 可以了,可以同时实现多个不同的异常处理,但不能出现包含状态。
全局异常捕获的原理是: 使用 AOP技术,采用异常通知的方式处理。
二、SpringBoot异步执行
- 创建一个简单的springboot项目
- 创建一个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";
}
}
- 编写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";
}
}
- 主方法上加上
@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
- 去官网下载
lombok.jar
包,官网: Download (projectlombok.org) - 打开lombok.jar所在的文件夹,按住shift+鼠标右键,选择->在此处打开powershell窗口
- 在窗口中写入
java -jar lombok.jar
点击回车 - 一般的都会自动扫描到软件然后点击
Install/Update
按钮安装
- 如果没有扫描到,则点击
specify location...
按钮
- 选择以后点击安装
- 安装成功以后,点击右下角退出
- 重启sts软件
- 创建一个简单的springboot项目,然后导入lombok依赖。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
- 创建简单的实体类,然后添加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;
}
- 通过查看Outline查看是否自动添加了方法
lombok的常用注解:
四、SpringBoot整合Swagger2
- 添加依赖
<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>
- 创建一个基本的spring,添加一个简单的业务
- 在启动类中添加
@EnableSwagger2
注解 - 在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;
}
}
- 启动项目,访问: http://localhost:8080/swagger-ui.html
常用注解
- @Api:修饰整个类,描述 Controller 的作用
- @ApiOperation:描述一个类的一个方法,或者说一个接口
- @ApiParam:单个参数描述
- @ApiModel:用对象来接收参数
- @ApiProperty:用对象接收参数时,描述对象的一个字段
- @ApiResponse:HTTP 响应其中1个描述
- @ApiResponses:HTTP 响应整体描述
- @ApiIgnore:使用该注解忽略这个 API
- @ApiImplicitParam:一个请求参数
- @ApiError :发生错误返回的信息
- @ApiImplicitParams:多个请求参数