All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.lframework.starter.web.components.WebExceptionHandler Maven / Gradle / Ivy

package com.lframework.starter.web.components;

import com.lframework.common.exceptions.BaseException;
import com.lframework.common.exceptions.ClientException;
import com.lframework.common.exceptions.SysException;
import com.lframework.common.exceptions.impl.DefaultClientException;
import com.lframework.common.exceptions.impl.DefaultSysException;
import com.lframework.common.exceptions.impl.InputErrorException;
import com.lframework.starter.web.components.validation.TypeMismatch;
import com.lframework.starter.web.resp.InvokeResultBuilder;
import com.lframework.starter.web.resp.Response;
import com.lframework.starter.web.utils.ResponseUtil;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.UnexpectedTypeException;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.fileupload.FileUploadException;
import org.springframework.beans.TypeMismatchException;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;

/**
 * 异常处理器
 *
 * @author zmj
 */
@Slf4j
@RestControllerAdvice
public class WebExceptionHandler {

  /**
   * 处理系统异常
   *
   * @param e
   * @return
   */
  @ExceptionHandler(ClientException.class)
  public Response handle(ClientException e, HandlerMethod method) {

    this.logException(e, method);

    this.setResponseCode(e);

    return InvokeResultBuilder.fail(e);
  }

  /**
   * 处理系统异常
   *
   * @param e
   * @return
   */
  @ExceptionHandler(SysException.class)
  public Response handle(SysException e, HandlerMethod method) {

    this.logException(e, method);

    BaseException ex = new DefaultSysException();
    this.setResponseCode(ex);

    return InvokeResultBuilder.fail(ex);
  }

  /**
   * 处理传入参数类型转换错误异常
   *
   * @param e
   * @param method
   * @return
   */
  @ExceptionHandler(UnexpectedTypeException.class)
  public Response handle(UnexpectedTypeException e, HandlerMethod method) {

    this.logException(e, method);

    BaseException ex = new InputErrorException();

    this.setResponseCode(ex);
    return InvokeResultBuilder.fail(ex);
  }

  @ExceptionHandler(BindException.class)
  public Response handle(BindException e, HandlerMethod method) {

    this.logException(e, method);

    InputErrorException exception = null;

    if (e.getErrorCount() > 0) {
      ObjectError objectError = e.getAllErrors().get(0);

      if (objectError instanceof FieldError && "typeMismatch".equals(objectError.getCode())) {
        String fieldName = ((FieldError) objectError).getField();

        Class targetClazz = e.getBindingResult().getTarget().getClass();

        TypeMismatch typeMismatch = null;
        try {
          typeMismatch = targetClazz.getDeclaredField(fieldName).getAnnotation(TypeMismatch.class);
        } catch (NoSuchFieldException exp) {
          throw new DefaultSysException(exp.getMessage());
        }
        if (typeMismatch != null) {
          exception = new InputErrorException(typeMismatch.message());
        }
      }
    }
    if (exception == null) {
      for (ObjectError error : e.getAllErrors()) {
        exception = new InputErrorException(error.getDefaultMessage());
        break;
      }

      if (exception == null) {
        exception = new InputErrorException();
      }
    }

    this.setResponseCode(exception);

    return InvokeResultBuilder.fail(exception);
  }

  @ExceptionHandler(MethodArgumentNotValidException.class)
  public Response methodArgumentNotValidException(MethodArgumentNotValidException e,
      HandlerMethod method) {

    this.logException(e, method);
    InputErrorException exception = null;
    for (ObjectError error : e.getBindingResult().getAllErrors()) {
      exception = new InputErrorException(error.getDefaultMessage());
      break;
    }

    if (exception == null) {
      throw new InputErrorException();
    }

    this.setResponseCode(exception);

    return InvokeResultBuilder.fail(exception);
  }

  /**
   * 处理未通过校验异常
   *
   * @param e
   * @param method
   * @return
   */
  @ExceptionHandler(ConstraintViolationException.class)
  public Response handle(ConstraintViolationException e, HandlerMethod method) {

    this.logException(e, method);

    InputErrorException exception = null;
    for (ConstraintViolation constraintViolation : e.getConstraintViolations()) {
      exception = new InputErrorException(constraintViolation.getMessage());
      break;
    }

    if (exception == null) {
      throw new InputErrorException();
    }

    this.setResponseCode(exception);

    return InvokeResultBuilder.fail(exception);
  }

  /**
   * 处理由于传入参数类型不匹配导致的异常
   *
   * @param e
   * @param method
   * @return
   */
  @ExceptionHandler(TypeMismatchException.class)
  public Response methodArgumentTypeMismatchException(TypeMismatchException e,
      HandlerMethod method) {

    this.logException(e, method);

    MethodParameter methodParameter = null;
    if (e instanceof MethodArgumentConversionNotSupportedException) {
      methodParameter = ((MethodArgumentConversionNotSupportedException) e).getParameter();
    } else if (e instanceof MethodArgumentTypeMismatchException) {
      methodParameter = ((MethodArgumentTypeMismatchException) e).getParameter();
    }

    BaseException ex = null;
    if (methodParameter != null) {
      TypeMismatch typeMismatch = methodParameter.getMethod()
          .getParameters()[methodParameter.getParameterIndex()].getAnnotation(TypeMismatch.class);
      if (typeMismatch != null) {
        ex = new InputErrorException(typeMismatch.message());
      }
    }

    if (ex == null) {
      ex = new InputErrorException();
    }

    this.setResponseCode(ex);

    return InvokeResultBuilder.fail(ex);
  }

  /**
   * 处理由于传入参数类型不匹配导致的异常
   *
   * @param e
   * @param method
   * @return
   */
  @ExceptionHandler(HttpMessageNotReadableException.class)
  public Response invalidFormatException(HttpMessageNotReadableException e, HandlerMethod method) {

    this.logException(e, method);

    BaseException ex = new InputErrorException();
    this.setResponseCode(ex);

    return InvokeResultBuilder.fail(ex);
  }

  /**
   * 处理由于传入方式错误导致的异常
   *
   * @param e
   * @param method
   * @return
   */
  @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
  public Response httpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e,
      HandlerMethod method) {

    this.logException(e, method);

    BaseException ex = new DefaultSysException();

    this.setResponseCode(ex);

    return InvokeResultBuilder.fail();
  }

  @ExceptionHandler(FileUploadException.class)
  public Response fileUploadExceptionHandler(FileUploadException e, HandlerMethod method) {

    this.logException(e, method);

    BaseException ex = new DefaultClientException("文件上传失败!");

    this.setResponseCode(ex);

    return InvokeResultBuilder.fail(ex);
  }

  /**
   * 处理Exception
   *
   * @param e
   * @param method
   * @return
   */
  @ExceptionHandler(Exception.class)
  public Response exceptionHandler(Exception e, HandlerMethod method) {

    this.logException(e, method);

    BaseException ex = new DefaultSysException();

    this.setResponseCode(ex);

    return InvokeResultBuilder.fail(ex);
  }

  /**
   * 处理Throwable
   *
   * @param e
   * @param method
   * @return
   */
  @ExceptionHandler(Throwable.class)
  public Response throwableHandle(Throwable e, HandlerMethod method) {

    this.logException(e, method);

    BaseException ex = new InputErrorException();

    this.setResponseCode(ex);

    return InvokeResultBuilder.fail(ex);
  }

  protected void logException(Throwable e, HandlerMethod method) {

    if (e instanceof ClientException) {
      if (log.isDebugEnabled()) {
        String className = method.getBeanType().getName();
        String methodName = method.getMethod().getName();
        log.debug("className={}, methodName={}, 有异常产生", className, methodName, e);
      }
    } else {
      String className = method.getBeanType().getName();
      String methodName = method.getMethod().getName();
      log.error("className={}, methodName={}, 有异常产生", className, methodName, e);
    }
  }

  protected void setResponseCode(BaseException e) {

    ResponseUtil.getResponse().setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy