一、创建项目
创建Maven项目,JDK1.8
引入Maven依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.0</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
创建配置文件application.yml、启动类App、测试接口TestController
server:
port: 8088
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
@RestController
public class TestController {
@GetMapping("/drone")
public ResponseEntity test(){
return ResponseEntity.ok("Hello World!");
}
}
访问测试
二、统一返回数据
返回状态码
@Getter
@AllArgsConstructor
public enum ReturnCode {
RC200(200,"操作成功"),
RC500(500,"操作失败");
private int code;
private String msg;
}
封装返回结果
@Data
public class ReturnData<T> implements Serializable {
//请求状态
private boolean success = false;
//返回状态码
private int code;
//返回数据
private String msg;
//接口请求时间
private long timestamp;
//返回结果
private T result;
public ReturnData() {
this.timestamp = System.currentTimeMillis();
}
public static <T> ReturnData<T> success(T result) {
ReturnData<T> data = new ReturnData<>();
data.setSuccess(true);
data.setCode(ReturnCode.RC200.getCode());
data.setMsg(ReturnCode.RC200.getMsg());
data.setResult(result);
return data;
}
public static <T> ReturnData<T> success(int code, String msg, T result) {
ReturnData<T> data = new ReturnData<>();
data.setSuccess(true);
data.setCode(code);
data.setMsg(msg);
data.setResult(result);
return data;
}
public static <T> ReturnData<T> failure(T result) {
ReturnData<T> data = new ReturnData<>();
data.setSuccess(false);
data.setCode(ReturnCode.RC500.getCode());
data.setMsg(ReturnCode.RC500.getMsg());
data.setResult(result);
return data;
}
public static <T> ReturnData<T> failure(int code, String msg) {
ReturnData<T> data = new ReturnData<>();
data.setSuccess(false);
data.setCode(code);
data.setMsg(msg);
return data;
}
}
测试接口
@GetMapping("/testReturnData")
public ReturnData testReturnData() {
return ReturnData.success("hello world");
}
访问测试
三、统一参数校验(Validator + 自动抛出异常)
内置参数校验注解:
创建入参对象,使用注解校验
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@NotNull(message = "用户id不能为空")
private Long id;
@NotNull(message = "用户账号不能为空")
@Size(min = 6, max = 11, message = "账号长度必须是6-11个字符")
private String account;
@NotNull(message = "用户密码不能为空")
@Size(min = 6, max = 11, message = "密码长度必须是6-16个字符")
private String password;
@NotNull(message = "用户邮箱不能为空")
@Email(message = "邮箱格式不正确")
private String email;
}
测试接口(使用注解@Validated)
@PostMapping("/testUser")
public ReturnData testUser(@RequestBody @Validated User user){
return ReturnData.success(user);
}
四、统一异常处理
创建统一异常处理类MyExceptionHandler
@RestControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ReturnData MethodArgumentNotValidException(MethodArgumentNotValidException e){
List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
List<String> collect = fieldErrors.stream()
.map(DefaultMessageSourceResolvable::getDefaultMessage)
.collect(Collectors.toList());
return ReturnData.failure(collect);
}
}
请求测试
自定义异常类APIException
@Getter
public class APIException extends RuntimeException{
private Integer errCode;
private String errMsg;
public APIException(Integer errCode, String errMsg, Exception e){
super(e);
this.errCode = errCode;
this.errMsg = errMsg;
}
}
在MyExceptionHandler异常处理器添加方法
@ExceptionHandler(APIException.class)
public ServiceResult APIException(APIException e){
return ServiceResult.failure(e.getErrCode(),e.getErrMsg());
}
测试接口
@GetMapping("/testAPIException")
public ReturnData testAPIException(){
try {
int i = 1/0;
return ReturnData.success(i);
}catch (Exception e){
throw new APIException(300,"代码错误");
}
}
请求测试