美文网首页
spring boot @ControllerAdvice 增强

spring boot @ControllerAdvice 增强

作者: 周六不算加班 | 来源:发表于2019-02-18 14:01 被阅读6次

    一、接口接受Date参数,可以传入String类型

    @ControllerAdvice
    public class CommonDateAdvice {
        @InitBinder
        public void initBinder(WebDataBinder webDataBinder) {
            webDataBinder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), false));
        }
    }
    

    二、统一异常返回

    2.1、异常返回主要实现

    @ControllerAdvice
    @ResponseBody
    public class CommonExceptionAdvice extends BaseExceptionAdvice {
    
        private Logger logger = LogManager.getLogger(this.getClass());
    
    
         /**
         * 401 - Bad Request
         */
        @ResponseStatus(HttpStatus.UNAUTHORIZED)
        @ExceptionHandler(TokenValidationException.class)
        public Object missingTokenException(TokenValidationException e,
                WebRequest request) {
            logger.error(e);
            return renderError(HttpStatus.BAD_REQUEST, request, "required_parameter_is_not_present");
        }
    
    
        /**
         * 400 - Bad Request
         */
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        @ExceptionHandler(MissingServletRequestParameterException.class)
        public Object handleMissingServletRequestParameterException(MissingServletRequestParameterException e,
            WebRequest request) {
            logger.error(e);
            return renderError(HttpStatus.BAD_REQUEST, request, "required_parameter_is_not_present");
        }
    
        /**
         * 400 - Bad Request
         */    
          @ResponseStatus(HttpStatus.BAD_REQUEST)
          @ExceptionHandler(HttpMessageNotReadableException.class)
          public Object handleHttpMessageNotReadableException(HttpMessageNotReadableException e, WebRequest request) {
            logger.error(e);
    
            return renderError(HttpStatus.BAD_REQUEST, request, "could_not_read_json");
        }
    
        /**
         * 400 - Bad Request
         */
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        @ExceptionHandler(MethodArgumentNotValidException.class)
    public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e, WebRequest request) {
            logger.error(e);
            BindingResult result = e.getBindingResult();
            FieldError error = result.getFieldError();
            String field = error.getField();
            String code = error.getDefaultMessage();
            String message = String.format("%s:%s", field, code);
            return renderError(HttpStatus.BAD_REQUEST, request, message);
        }
    
        /**
         * 400 - Bad Request
         */
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        @ExceptionHandler(BindException.class)
        public Object handleBindException(BindException e, WebRequest request) {
            logger.error(e);
            BindingResult result = e.getBindingResult();
            FieldError error = result.getFieldError();
            String field = error.getField();
            String code = error.getDefaultMessage();
            String message = String.format("%s:%s", field, code);
            return renderError(HttpStatus.BAD_REQUEST, request, message);
        }
    
        /**
         * 400 - Bad Request
         */
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        @ExceptionHandler(ConstraintViolationException.class)
        public Object handleServiceException(ConstraintViolationException e, WebRequest request) {
            logger.error(e);
            Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
            ConstraintViolation<?> violation = violations.iterator().next();
            String message = violation.getMessage();
            return renderError(HttpStatus.BAD_REQUEST, request, message);
        }
    
        /**
         * 400 - Bad Request
         */
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        @ExceptionHandler(ValidationException.class)
        public Object handleValidationException(ValidationException e, WebRequest request) {
            logger.error(e);
            return renderError(HttpStatus.BAD_REQUEST, request, "validation_exception");
        }
        /**
         * 404 - Bad Request
         */
        @ResponseStatus(HttpStatus.NOT_FOUND)
        @ExceptionHandler(HttpException.class)
        public Object notFoundPage(Exception e, WebRequest request) {
            logger.error(e);
            return renderError(HttpStatus.BAD_REQUEST, request, "not found page");
        }
    
        /**
         * 405 - Method Not Allowed
         */
        @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
        @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    public Object handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e,
            WebRequest request) {
            logger.error(e);
            logger.error(request.getContextPath());
            return renderError(HttpStatus.METHOD_NOT_ALLOWED, request, "request_method_not_supported");
        }
    
        /**
         * 415 - Unsupported Media Type
         */
        @ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
        @ExceptionHandler(HttpMediaTypeNotSupportedException.class)
        public Object handleHttpMediaTypeNotSupportedException(Exception e, WebRequest request) {
            logger.error(e);
            return renderError(HttpStatus.UNSUPPORTED_MEDIA_TYPE, request, "content_type_not_supported");
        }
    
        /**
         * 500 - Internal Server Error
         */
        @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
        @ExceptionHandler(MyException.class)
        public Object handleServiceException(MyException e, WebRequest request) {
            logger.error(e);
            return renderError(HttpStatus.INTERNAL_SERVER_ERROR, request, e.getMessage());
        }
    
        /**
         * 500 - Internal Server Error
         */
        @ResponseStatus(HttpStatus.NOT_FOUND)
        @ExceptionHandler(Exception.class)
        public Object handleException(Exception e, WebRequest request) {
            logger.error(e);
            return renderError(HttpStatus.NOT_FOUND, request, e.getMessage());
        }
    
        /**
         * 操作数据库出现异常:名称重复,外键关联
         */
        @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
        @ExceptionHandler(DataIntegrityViolationException.class)
        public Object handleException(DataIntegrityViolationException e, WebRequest request) {
            logger.error(e);
            return renderError(HttpStatus.INTERNAL_SERVER_ERROR, request, "操作数据库出现异常:字段重复、有外键关联等");
        }
    
    
    
    }
    

    2.2、基础类实现

    public class BaseExceptionAdvice {
        /**
         * 失败
         * 
         * @return {Object}
         */
        public Object renderError(HttpStatus status, WebRequest request) {
            Result result = new Result();
            result.setSuccess(false);
            result.setStatusValue(status.value());
            result.setPath(request.getContextPath());
            return result;
        }
    
        /**
         * 失败
         * 
         * @return {Object}
         */
        public Object renderError(Integer status, String msg, String path) {
            Result result = new Result();
            result.setSuccess(false);
            result.setStatusValue(status);
            result.setMsg(msg);
            result.setPath(path);
            return result;
        }
    
        /**
         * 失败
         * 
         * @return {Object}
         */
        public Object renderError(HttpStatus status, WebRequest request, String msg) {
            Result result = new Result();
            result.setSuccess(false);
            result.setStatusValue(status.value());
            ServletWebRequest req = (ServletWebRequest) request;
            result.setPath(req.getRequest().getServletPath());
            result.setMsg(msg);
            return result;
        }
    }
    

    相关文章

      网友评论

          本文标题:spring boot @ControllerAdvice 增强

          本文链接:https://www.haomeiwen.com/subject/iesaeqtx.html