章节
- 不再视野黑盒,一天学会简单使用springboot(1) - 掘金 (juejin.cn)
- 不再视野黑盒,新建springboot项目(2) - 掘金 (juejin.cn)
- 不再视野黑盒,整合mybatis plus(3) - 掘金 (juejin.cn)
- 不再视野黑盒,统一结果封装(4) - 掘金 (juejin.cn)
- 不再视野黑盒,整合shiro+jwt,并会话共享(5) - 掘金 (juejin.cn)
- 不再视野黑盒,异常处理&实体校验(6) - 掘金 (juejin.cn)
- 不再视野黑盒,swagger3集成(7) - 掘金 (juejin.cn)
- 不再视野黑盒,登录&增删改查(8) - 掘金 (juejin.cn)
异常处理
有时候不可避免服务器报错的情况,如果不配置异常处理机制,就会默认返回tomcat或者nginx的5XX页面,对普通用户来说,不太友好,用户也不懂什么情况。这时候需要我们程序员设计返回一个友好简单的格式给前端。
以下是处理这种情况的方法:
- 使用
@ControllerAdvice注解来进行统一异常处理。通过@ExceptionHandler注解指定捕获的各种异常类型,这样就可以在全局范围内处理这些异常。这种异常处理机制能够捕获并处理所有类似的异常。 - 定义全局异常处理方法。
@ControllerAdvice注解表示定义全局控制器异常处理,而@ExceptionHandler注解表示针对性异常处理,可针对每种异常进行专门处理。
通过上述方法,我们可以在发生异常时,统一处理并返回一个友好且简洁的格式给前端。这样,即使出现问题,用户也能够更好地理解和处理异常情况。
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.UNAUTHORIZED)
@ExceptionHandler(value = ShiroException.class)
public Result handler(ShiroException e) {
log.error("运行时异常:----------------{}", e);
return Result.fail(401, e.getMessage(), null);
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public Result handler(MethodArgumentNotValidException e) {
log.error("实体校验异常:----------------{}", e);
BindingResult bindingResult = e.getBindingResult();
ObjectError objectError = bindingResult.getAllErrors().stream().findFirst().get();
return Result.fail(objectError.getDefaultMessage());
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = IllegalArgumentException.class)
public Result handler(IllegalArgumentException e) {
log.error("Assert异常:----------------{}", e);
return Result.fail(e.getMessage());
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = RuntimeException.class)
public Result handler(RuntimeException e) {
log.error("运行时异常:----------------{}", e);
return Result.fail(e.getMessage());
}
}
上面我们捕捉了几个异常:
- ShiroException:shiro抛出的异常,比如没有权限,用户登录异常
- IllegalArgumentException:处理Assert的异常
- MethodArgumentNotValidException:处理实体校验的异常
- RuntimeException:捕捉其他异常
实体校验
当我们表单数据提交的时候,前端的校验我们可以使用一些类似于jQuery Validate等js插件实现,而后端我们可以使用Hibernate validatior来做校验。
我们使用springboot框架作为基础,那么就已经自动集成了Hibernate validatior。
第一步:实体的属性上添加对应的校验规则
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("m_user")
public class UserDemo implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@NotBlank(message = "昵称不能为空")
@Schema(description = "用户姓名")
private String username;
private String avatar;
@NotBlank(message = "邮箱不能为空")
@Email(message = "邮箱格式不正确")
private String email;
private String password;
private Integer status;
private LocalDateTime created;
private LocalDateTime lastLogin;
}
第二步 :使用@Validated注解方式
使用@Validated注解方式,如果实体不符合要求,系统会抛出异常,那么我们的异常处理中就捕获到MethodArgumentNotValidException。
/**
* 测试实体校验
* @param user
* @return
*/
@PostMapping("/save")
public Object testUser(@Validated @RequestBody UserDemo user) {
return user.toString();
}
跨域问题
因为是前后端分析,所以跨域问题是避免不了的,我们直接在后台进行全局跨域处理:
/**
* 解决跨域问题
*/
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
.allowCredentials(true)
.maxAge(3600)
.allowedHeaders("*");
}
}