美文网首页
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