创建一个springboot项目 以登录接口为例
所需依赖:
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-boot.version>2.7.6</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
</dependency>
</dependencies>
post入参校验
controller入参@ResponseBody 添加@Valid注解
@PostMapping("login")
public DataResult login(@Valid @RequestBody LoginDTO loginDTO) {
loginService.login(loginDTO);
return DataResult.success();
}
LoginDTO
@Data
public class LoginDTO {
@NotBlank(message = "账号不能为空")
private String account;
@NotBlank(message = "密码不能为空")
private String password;
@NotBlank(message = "验证码不能为空")
private String codeId;
@NotBlank(message = "验证码不能为空")
private String code;
}
@NotNull和@Valid配合校验参数的合法性
出参封装
设计一个返回封装类,和前端定义好code标识是否请求成功,msg为提示信息,data是需要返回的数据
@Data
@Builder
public class DataResult {
private int code;
private String msg;
private Object data;
public static DataResult success() {
return DataResult.builder()
.msg("请求成功")
.build();
}
public static DataResult success(Object data) {
return DataResult.builder()
.msg("请求成功")
.data(data)
.build();
}
public static DataResult fail(String msg) {
return DataResult.builder()
.code(500)
.msg(msg)
.build();
}
}
自定义异常
业务中部分异常是可知的比如账号不存在、密码错误等,不需要打印堆栈日志只需要返回提示信息即可,此处只定义了一个通用异常,可根据具体业务再定义
public class CommonException extends RuntimeException {
public CommonException(String msg) {
super(msg);
}
}
public void login(LoginDTO loginDTO) {
log.info("登录,account:{},password:{}", loginDTO.getAccount(), loginDTO.getPassword());
boolean checkResult = verificationCodeService.checkCode(loginDTO.getCodeId(), loginDTO.getCode());
if (!checkResult) {
throw new CommonException("验证码不正确");
}
if (!loginDTO.getAccount().equals(account) || !loginDTO.getPassword().equals(password)) {
throw new CommonException("账号或密码错误");
}
log.info("登录成功");
}
全局异常捕获
如果后端请求失败或出现了自定义异常,比如账号不存在、密码错误、参数校验失败、其他运行时异常等前端会收到500等错误信息,可以使用全局异常捕获并以自定义返回对象封装告知前端
@RestControllerAdvice
public class GlobalController {
@ExceptionHandler(CommonException.class)
public DataResult commonException(CommonException e) {
return DataResult.fail(e.getMessage());
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public DataResult validException(MethodArgumentNotValidException e) {
return DataResult.fail(e.getAllErrors().get(0).getDefaultMessage());
}
}
此处只是列举了两个,可以继续添加其他的,比如Exception异常会最终匹配