package com.aijia.kmt.common; import com.aijia.core.base.ResponseEntity; import com.aijia.core.security.exception.CommonException; import com.aijia.core.web.ResponseConstant; import com.aijia.core.web.exception.RequestsException; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.validation.FieldError; import org.springframework.web.HttpMediaTypeNotSupportedException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.util.ContentCachingRequestWrapper; import javax.servlet.http.HttpServletRequest; import java.nio.charset.Charset; import java.util.List; /** * * 类名称:ExceptionAdvice
* 类描述:异常处理
* @author yrf * @version v1.0 */ @ControllerAdvice @ResponseBody public class GlobalExceptionHandler { private final Logger logger = LoggerFactory.getLogger(this.getClass()); /** * 400 - Bad Request */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(HttpMessageNotReadableException.class) public ResponseEntity handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { logger.error("参数解析失败", e); return ResponseEntity.failure("无法解析JSON"); } @ResponseStatus(HttpStatus.EXPECTATION_FAILED) @ExceptionHandler(RequestsException.class) public ResponseEntity handleRequestsException(RequestsException e) { logger.warn("请求太频繁,稍后再试", e); return ResponseEntity.failure("请求太频繁,稍后再试"); } /** * 405 - Method Not Allowed */ @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) @ExceptionHandler(HttpRequestMethodNotSupportedException.class) public ResponseEntity handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) { logger.error("不支持当前请求方法", e); return ResponseEntity.failure("不支持当前请求方法"); } /** * 415 - Unsupported Media Type */ @ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE) @ExceptionHandler(HttpMediaTypeNotSupportedException.class) public ResponseEntity handleHttpMediaTypeNotSupportedException(Exception e) { logger.error("不支持当前媒体类型", e); return ResponseEntity.failure("不支持的内容类型"); } /** * 500 - Internal Server Error */ @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler(Exception.class) public ResponseEntity handleException(HttpServletRequest request, Exception e) throws Exception{ String bodyStr = null; if (request instanceof ContentCachingRequestWrapper) { ContentCachingRequestWrapper contentCachingRequestWrapper = (ContentCachingRequestWrapper) request; bodyStr = StringUtils.toEncodedString(contentCachingRequestWrapper.getContentAsByteArray(), Charset.forName(contentCachingRequestWrapper.getCharacterEncoding())); } logger.error(String.format("服务运行异常,uri = [%s] \n请求参数 body = %s", request.getRequestURI(), bodyStr), e); return ResponseEntity.failure(); } /** * 500 - Internal Server Error * 用于给用户提示时抛出,如:操作失败的原因 */ @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler(CommonException.class) public ResponseEntity handleCommonException(CommonException e) { return ResponseEntity.failure(ResponseConstant.CODE_000, e.getMessage()); } /** * 500 - Internal Server Error * 用于处理断言抛出的异常提示 */ @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler(IllegalArgumentException.class) public ResponseEntity handleIllegalArgumentExceptionException(IllegalArgumentException e) { return ResponseEntity.failure(e.getMessage()); } /** * 500 - Internal Server Error * 参数校验失败时抛出,如:非空属性的值为空 */ @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { StringBuilder errorInfo = new StringBuilder(); List fieldErrorList = e.getBindingResult().getFieldErrors(); fieldErrorList.forEach(fieldError -> errorInfo.append(fieldError.getDefaultMessage()).append(",")); errorInfo.deleteCharAt(errorInfo.length() - 1); return ResponseEntity.failure(ResponseConstant.CODE_000, errorInfo.toString()); } }