SpringBoot全局异常捕获参数以及参数异常的解决方案
作者:小杨同学~
这篇文章主要介绍了SpringBoot全局异常捕获参数以及参数异常的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
现在比较常用的方式是给前端返回JSON,但是有些时候程序出现一些异常,导致前端页面报错不是很友好,所以就需要对项目进行全局的异常捕获,返回给前端固定的格式,进行友好的处理!
话不多说,开始写代码
一.全局异常捕获
1.1 全局捕获
@Slf4j
@RestControllerAdvice(annotations = {RestController.class})
public class BaseExceptionHandler {
/**
* <p>
* 全局Base异常处理
* </p>
* @version 1.0.0
* @author Dylan
* @since 2020/2/27
* @param e
*/
@ExceptionHandler({BaseException.class,BusinessException.class})
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public R customExceptionHandler(BaseException e) {
sysLog();
log.info("自定义异常 ---> {}",e);
return R.error(e.getCode(),e.getMsg());
}
/**
* <p>
* 其他类型的异常处理
* </p>
* @version 1.0.0
* @author Dylan
* @since 2020/2/27
* @param e
*/
@ExceptionHandler({Exception.class})
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public R customExceptionHandler(Exception e) {
sysLog();
log.info("未知的运行异常 ---> ",e);
return R.error();
}
/**
* <p>
* 参数异常处理
* </p>
* @version 1.0.0
* @author Dylan-haiji
* @since 2020/2/28
* @param exception
*/
@ExceptionHandler(value= MethodArgumentNotValidException.class)
public R methodNotValidHandler(MethodArgumentNotValidException exception) {
sysLog();
log.info("参数异常 ---> ",exception);
List<FieldError> fieldErrors = exception.getBindingResult().getFieldErrors();
return R.error(fieldErrors.get(0).getDefaultMessage());
}
/**
* <p>
* 统一日志输出
* </p>
* @version 1.0.0
* @author Dylan-haiji
* @since 2020/2/28
* @param
* @return void
*/
private void sysLog(){
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String requestUri = request.getRequestURI();
log.info("异常 method ---> {}",request.getMethod());
log.info("异常 requestURI ---> {}",requestUri);
}
}1.2 基础异常
public class BaseException extends RuntimeException{
private Integer code;
private String msg;
public BaseException(Integer code, String msg){
this.code = code;
this.msg = msg;
}
public BaseException( String msg){
this.code = 500;
this.msg = msg;
}
}1.3 业务参数异常
public class BusinessException extends BaseException {
public BusinessException(Integer code, String msg) {
super(code, msg);
}
public BusinessException() {
super(ConstantUtils.BUSINESS_DATA);
}
public BusinessException(String msg) {
super(msg);
}
}二.验证
通过上面的配置,我们可以进行全局的异常捕获,接下来我们以参数验证为例进行验证是否可用!
2.1 定义实体类
public class Demo implements Serializable {
@NotBlank(message = "请选择时间")
private String endDate;
@NotBlank(message = "请选择范围类型")
private String value;
}2.2 定义接口
@PostMapping(value = "list")
public R getOverView(@RequestBody @Valid Demo demo){
return R.ok();
}
这是我们调用接口,直传一个参数!达到了我们的预期效果

当然我们处理业务的时候也可进行异常的抛出,这样也会进行全局的捕获!

这样的接口返回就非常的友好了!
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
