MethodArgumentTypeMismatchException異常捕捉


- 線上bug異常捕捉

- 背景:上線的時候發現一個bug,參數類型定義是一個Long型,但是前端傳遞過來的參數是一個undefined,導致解析失敗。但是查看日志打印只顯示類型轉換錯誤(MethodArgumentTypeMismatchException),也不清楚調的是哪個接口.於是調整了一下日志捕捉代碼。

private final static String ERROR_MSG = "服務器開小差啦!";


    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    public ResponseData<Object> methodNotSupportedHandler(HttpRequestMethodNotSupportedException e, HttpServletRequest request) {
        log.error("url:{} -> 請求方式不正確:{}", request == null ? null : request.getRequestURL(), e);
        return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), e.getMessage());
    }

    @ExceptionHandler(MissingServletRequestParameterException.class)
    public ResponseData<Object> paramErrorHandler(Exception e, HttpServletRequest request) {
        log.error("url:{} -> 參數異常:{}", request == null ? null : request.getRequestURL(), e);
        return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), e.getMessage());
    }

    @ExceptionHandler(MethodArgumentTypeMismatchException.class)
    public ResponseData<Object> mismatchErrorHandler(MethodArgumentTypeMismatchException e) {
        log.error("參數轉換失敗,方法:" + Objects.requireNonNull(e.getParameter().getMethod()).getName() + ",參數:" +
                e.getName() + ",信息:" + e.getLocalizedMessage());
        return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), e.getMessage());
    }

    @ExceptionHandler(BusinessException.class)
    public ResponseData<Object> handler(BusinessException e, HttpServletRequest request) {
        log.error("url:{} -> 業務異常:{}", request == null ? null : request.getRequestURL(), e);
        Optional.ofNullable(request)
                .ifPresent(r -> {
                            TreeMap<String, String> reqMap = new TreeMap<>();
                            for (Map.Entry<String, String[]> me : r.getParameterMap().entrySet()) {
                                String key = me.getKey();
                                String value = me.getValue()[0];
                                reqMap.put(key, value);
                            }
                            log.error("user:{},mate:{},入參:{}",
                                    UserContext.getUserId(), MateContext.getMate(), JSON.toJSONString(reqMap));
                        }
                );
        return ResponseData.fail(e.getCode() == null ? ResponseCode.INTERNAL_ERROR.getCode() : e.getCode(), e.getMsg());
    }

    @ExceptionHandler(ParamException.class)
    public ResponseData<Object> handler(ParamException e, HttpServletRequest request) {
        log.error("url:{} -> 參數異常:{}", request == null ? null : request.getRequestURL(), e);
        Optional.ofNullable(request)
                .ifPresent(r -> {
                            TreeMap<String, String> reqMap = new TreeMap<>();
                            for (Map.Entry<String, String[]> me : r.getParameterMap().entrySet()) {
                                String key = me.getKey();
                                String value = me.getValue()[0];
                                reqMap.put(key, value);
                            }
                            log.error("user:{},mate:{},入參:{}",
                                    UserContext.getUserId(), MateContext.getMate(), JSON.toJSONString(reqMap));
                        }
                );
        return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), e.getMsg());
    }

    /**
     * 配合Assert使用,香
     *
     * @param e       e
     * @param request request
     * @return object
     */
    @ExceptionHandler({IllegalStateException.class, IllegalArgumentException.class})
    public ResponseData<Object> handler(RuntimeException e, HttpServletRequest request) {
        log.error("url:{} -> 業務異常:{}", request == null ? null : request.getRequestURL(), e);
        return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), e.getMessage());
    }

    @ExceptionHandler
    public ResponseData<Object> handler(Exception e, HttpServletRequest request) {
        log.error("url:{} -> 錯誤:{}", request == null ? null : request.getRequestURL(), e);

        Optional.ofNullable(request)
                .ifPresent(r -> {
                            TreeMap<String, String> reqMap = new TreeMap<>();
                            for (Map.Entry<String, String[]> me : r.getParameterMap().entrySet()) {
                                String key = me.getKey();
                                String value = me.getValue()[0];
                                reqMap.put(key, value);
                            }
                            log.error("user:{},mate:{},入參:{}",
                                    UserContext.getUserId(), MateContext.getMate(), JSON.toJSONString(reqMap));
                        }
                );
        return ResponseData.fail(ResponseCode.INTERNAL_ERROR.getCode(), ERROR_MSG);
    }

    /**
     * body參數
     *
     * @param e BindException
     */
    @ExceptionHandler(BindException.class)
    public ResponseData<Object> handlerBindException(BindException e) {
        StringBuilder msg = new StringBuilder();
        FieldError c = e.getBindingResult().getFieldErrors().get(0);
        msg.append(c.getDefaultMessage()).append(":").append(c.getRejectedValue());
        return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), msg.toString());
    }

    /**
     * 方法參數
     *
     * @param e ConstraintViolationException
     */
    @ExceptionHandler(ConstraintViolationException.class)
    public ResponseData<Object> handlerConstraintViolationException(ConstraintViolationException e) {
        StringBuilder msg = new StringBuilder();
        ConstraintViolation<?> violation = e.getConstraintViolations().iterator().next();
        msg.append(violation.getMessage()).append(":").append(violation.getInvalidValue());
        return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), msg.toString());
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM