SpringBoot参数异常以及全局异常的处理

平时在写代码的时候,特别是controller,我们总会有一堆参数验证,大家也都会感到特别烦,那么如何处理呢?Spring为我们提供了很好的验证注解 @Validated,相信大家也比较常用。

但是,当我们自定义异常的时候就麻烦了,不过,别着急,Spring还为我们提供了@ControllerAdvice@ExceptionHandler注解来帮助我们处理异常。

下面附上代码:

controller

@RequestMapping(value = "/searchTest", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
public BaseResponse searchTest(@RequestBody @Validated SearchTestReq req) {
    int a = 1/0;
    return new BaseResponse();
}

Model:注意属性上的注解,NotBlank适用于String,NotNull则适用于Long Integer等类型

@Data
@ToString
public class SearchTestReq {
    @NotBlank(message = "URL can't null")
    private String imgURL;

    @NotNull(message = "userId Can't be empty")
    @Min(value = 0,message = "userId No less than 0")
    private Long userId;

    @NotBlank(message = "orderID Can't be empty")
    private String orderId;
}

异常捕获类:

上面两项做完以后,框架就可以帮我们处理异常了,但是返回的异常信息并不是我们想要的下面附上最重要的异常处理类:

import org.apache.commons.lang.text.StrBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

/**
 * 异常处理 
 * spring mvc提供了ControllerAdvice注解对异常进行统一的处理
 * @author Admin
 * @date 2019年9月2日18:12:59
 */
@ControllerAdvice
public class ExceptionAdvice {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 这里统一处理参数异常可根据自己需要封装返回信息
     * 当不符合注解上的验证规则,会被该方法捕获到
     * @param ex 方法参数异常
     * @return BaseResponse
     */
    @ExceptionHandler
    @ResponseBody
    public BaseResponse handleParamsException(MethodArgumentNotValidException ex){
        BindingResult bindingResult = ex.getBindingResult();
        List<FieldError> errors = bindingResult.getFieldErrors();
        StrBuilder errorMsg = new StrBuilder();
        errorMsg.append("param exception ");
        for (FieldError error : errors){
            errorMsg.append(error.getField());
            errorMsg.append(":");
            errorMsg.append(error.getDefaultMessage());
            errorMsg.append("; ");
        }

        return new BaseResponse(BaseResponse.PARAM_ERROR,errorMsg.toString());
    }

    /**
     * 处理方法的顶级异常信息,可以处理事务等等
     * 比如我controller里面的1/0异常就会被该方法捕获到
     * controller里面就不再捕获了
     * @param ex 异常
     * @return BaseResponse
     */
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public BaseResponse handleParamsException(Exception ex){
        logger.error("system error:{}",ex);
        return new BaseResponse(BaseResponse.SYSTEM_ERROR,ex.getMessage());
    }
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值