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();
 }

这是我们调用接口,直传一个参数!达到了我们的预期效果
在这里插入图片描述
当然我们处理业务的时候也可进行异常的抛出,这样也会进行全局的捕获!
在这里插入图片描述
这样的接口返回就非常的友好了!
本文的分享暂时就到这里,希望对您有所帮助
关注 Java有货领取更多资料

联系小编。微信:372787553,带您进群互相学习
左侧小编微信,右侧获取免费资料
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot中,全局异常处理器可以用于捕获和处理应用程序中抛出的异常。然而,默认情况下,Spring Boot无法捕获和处理HttpMessageNotReadableException异常。这是因为HttpMessageNotReadableException异常是由HttpMessageConverter引起的,它在尝试将请求正文转换为控制器方法参数时发生错误。 要解决这个问题,你可以实现自己的全局异常处理器,并在其中捕获和处理HttpMessageNotReadableException异常。以下是一个示例: ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(HttpMessageNotReadableException.class) public ResponseEntity<Object> handleHttpMessageNotReadableException( HttpMessageNotReadableException ex, WebRequest request) { // 处理HttpMessageNotReadableException异常 // 返回自定义错误信息或其他逻辑 return new ResponseEntity<>("Error: Invalid request body", HttpStatus.BAD_REQUEST); } // 添加其他异常处理方法... } ``` 在上面的示例中,我们使用@ControllerAdvice注释来标记全局异常处理器类,并使用@ExceptionHandler注释来指定处理HttpMessageNotReadableException异常的方法。在方法中,我们可以根据需要自定义处理逻辑,并返回自定义错误信息或适当的HTTP状态码。 注意,为了使全局异常处理器生效,还需要确保在应用程序中启用了异常处理机制。你可以通过在应用程序的启动类上添加@EnableWebMvc或@EnableWebFlux注释来实现这一点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小杨同学~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值