springMVC-统一参数验证&业务异常优雅地处理

往往为了程序的健壮性,有时候不得不时刻提防异常的发生,一般做法就是能try的地方尽量try住。但是太过繁琐,对业务开发非常不友好。如何才可以不关心这类异常呢?全部往外抛呢。

如何优雅地处理?

声明一个全局异常捕获的切

/**
 * 统一异常处理:针对没有显式捕获异常的controller
 */
@ControllerAdvice
@Slf4j
public class ExceptionHandlerAdvice {

    @ExceptionHandler({Exception.class})
    @ResponseBody
    public BaseJsonResponse handleException(Exception e) {
        log.error("sys error", e);
        //参数验证失败,例如非空验证,日期格式验证等
        if (e instanceof MethodArgumentNotValidException) {
            MethodArgumentNotValidException methodArgumentNotValidException = (MethodArgumentNotValidException) e;
            FieldError fieldError = methodArgumentNotValidException.getBindingResult().getFieldError();
            String errorMsg = fieldError.getDefaultMessage();
            return new BaseJsonResponse().error(1, fieldError.getField() + errorMsg);
        } else//TODO 这里可以定制化业务异常
            return new BaseJsonResponse().error(1, e.getMessage());
    }
}

demo代码

    @RequestMapping(value = "/xxx.json", method = RequestMethod.POST)
    public @ResponseBody BaseResponse xxx(@Valid @RequestBody XxxReq req) {
    }
    
    @Data
    public class XxxReq {
        @NotNull
        private Integer id;
        @NotNull
        private Integer userId;
        @NotNull
        @Pattern(regexp = GlobalVar.DATE_PATTERN_YMD, message = GlobalVar.DATE_PATTERN_YMD_ERROR)
        private String date;
        @NotNull
        private Integer type;
    }

效果

2019-09-26 10:48:02.872 [http-apr-8080-exec-1] INFO 
                c.q.filter.HttpLogTraceFilter - reqBody={"id":123,"name":"xx"}
2019-09-26 10:48:02.872 [http-apr-8080-exec-1] INFO 
                c.q.filter.HttpLogTraceFilter - respBody={"result":1,"message":"date不能为null"}

 

你可能感兴趣的:(实战)