一个后端项目我们应该考虑如下问题:
- ①:参数的接受及校验;
- ②:统一返回体;
- ③:统一异常处理;
- ④:代码生成器
1、参数的接受及校验
我们可以通过自定义接受对象和返回对象来接受这个问题,再通过@RequestBody
,@RequestParam
和@PathVariable
注解来进行参数获取。
参数校验:
我们可以通过validation来解决这个问题,我们主要做三步:
- 引入组件:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
- 给需要校验的字段上加注解
public class UserUpdateVM {
@NotBlank
private String realName;
private String age;
private Integer sex;
private String birthDay;
private String phone;
@NotNull
private Integer userLevel;
}
下面是常用的注解:
注解 | 校验功能 |
---|---|
@AssertFalse | 必须是false |
@AssertTrue | 必须是true |
@DecimalMax | 小于等于给定的值 |
@DecimalMin | 大于等于给定的值 |
@Digits | 可设定最大整数位数和最大小数位数 |
校验是否符合Email格式 | |
@Future | 必须是将来的时间 |
@FutureOrPresent | 当前或将来时间 |
@Max | 最大值 |
@Min | 最小值 |
@Negative | 负数(不包括0) |
@NegativeOrZero | 负数或0 |
@NotBlank | 不为null并且包含至少一个非空白字符 |
@NotEmpty | 不为null并且不为空 |
@NotNull | 不为null |
@Null | 为null |
@Past | 必须是过去的时间 |
@PastOrPresent | 必须是过去的时间,包含现在 |
@PositiveOrZero | 正数或0 |
@Size | 校验容器的元素个数 |
- Controller中方法添加
@valid
注解
@PostMapping("register")
public Result register(@RequestBody @Valid UserRegisterVM vm){
...
}
2、统一返回体
常见的返回体如下:
public class Result<T> {
private int code;
private String message;
private T response;
...
}
再搭配上系统状态类
public enum SystemCode {
/**
* 成功
*/
OK(1, "成功"),
AccessTokenError(400, "用户登录令牌失效"),
UNAUTHORIZED(401, "用户未登录"),
AuthError(402, "用户名或密码错误"),
InnerError(500, "系统内部错误"),
ParameterValidError(501, "参数验证错误"),
AccessDenied(502,"用户没有权限访问");
int code;
String message;
...
}
我们再往Result类上添加一些静态方法,就很ok
public class Result<T> {
...
public static Result ok(){
SystemCode ok = SystemCode.OK;
return new Result(ok.getCode(),ok.getMessage());
}
public static<F> Result<F> ok(F data){
SystemCode ok = SystemCode.OK;
return new Result<>(ok.getCode(),ok.getMessage(),data);
}
public static Result fail(Integer code,String message){
return new Result(code,message);
}
}
三、统一异常捕获
使用ControllerAdvice
+@ExceptionHandler
就可以解决,增强controller,对其抛出的Exception进行捕获。MethodArgumentNotValidException
是validation校验失败后抛出的异常,BindException
是前后端数据绑定失败抛出的异常,比如日期格式不正确。
@ControllerAdvice
public class ExceptionHandle {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public Result handler(MethodArgumentNotValidException e) {
...
}
@ExceptionHandler(BindException.class)
@ResponseBody
public Result handler(BindException e) {
...
}
}
四、代码生成器
使用intelllij IDEA编辑器推荐使用Easy-Code插件,好用,点赞!
EasyCode使用传送门