package cn.com.cs.core.exception; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.validation.BindException; import org.springframework.validation.BindingResult; 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.MissingServletRequestParameterException; 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.servlet.NoHandlerFoundException; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import javax.xml.bind.ValidationException; import java.util.Set; /** * 異常處理類 */ @ControllerAdvice @ResponseBody public class CommonExceptionAdvice { private static Logger logger = LoggerFactory.getLogger(CommonExceptionAdvice.class); /** * 400 - Bad Request */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(MissingServletRequestParameterException.class) public String handleMissingServletRequestParameterException(MissingServletRequestParameterException e) { logger.error("缺少請求參數", e); return "缺少請求參數"; } /** * 400 - Bad Request */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(HttpMessageNotReadableException.class) public String handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { logger.error("參數解析失敗", e); return "參數解析失敗"; } /** * 400 - Bad Request */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(MethodArgumentNotValidException.class) public String handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { 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 "參數驗證失敗="+message; } /** * 400 - Bad Request */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(BindException.class) public String handleBindException(BindException e) { 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 "參數綁定失敗="+message; } /** * 400 - Bad Request */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(ConstraintViolationException.class) public String handleServiceException(ConstraintViolationException e) { logger.error("參數驗證失敗", e); Set<ConstraintViolation<?>> violations = e.getConstraintViolations(); ConstraintViolation<?> violation = violations.iterator().next(); String message = violation.getMessage(); return "參數驗證失敗" + message; } /** * 400 - Bad Request */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(ValidationException.class) public String handleValidationException(ValidationException e) { logger.error("參數驗證失敗", e); return "參數驗證失敗"; } /** * 404 - Not Found */ @ResponseStatus(HttpStatus.NOT_FOUND) @ExceptionHandler(NoHandlerFoundException.class) public String noHandlerFoundException(NoHandlerFoundException e) { logger.error("Not Found", e); return "Not Found="+e; } /** * 405 - Method Not Allowed */ @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) @ExceptionHandler(HttpRequestMethodNotSupportedException.class) public String handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) { logger.error("不支持當前請求方法", e); return "request_method_not_supported"; } /** * 415 - Unsupported Media Type */ @ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE) @ExceptionHandler(HttpMediaTypeNotSupportedException.class) public String handleHttpMediaTypeNotSupportedException(HttpMediaTypeNotSupportedException e) { logger.error("不支持當前媒體類型", e); return "content_type_not_supported"; } /** * 業務層需要自己聲明異常的情況 */ @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler(ServiceException.class) public String handleServiceException(ServiceException e) { logger.error("業務邏輯異常", e); return "業務邏輯異常:" + e.getMessage(); } /** * 操作數據或庫出現異常 */ @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler(DataDoException.class) public String handleException(DataDoException e) { logger.error("操作數據庫出現異常:", e); return "操作數據庫出現異常:字段重復、有外鍵關聯等"; } /** * 500 - Internal Server Error */ /* @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler(Exception.class) public String handleException(Exception e) { logger.error("通用異常", e); return "500通用異常:" + e.getMessage(); }*/ /** * 獲取其它異常。包括500 * @param e * @return * @throws Exception */ @ExceptionHandler(value = Exception.class) public String defaultErrorHandler(Exception e){ logger.error("Exception", e); return "其它異常:" + e.getMessage(); } }
package cn.com.cs.core.exception; /** * 操作數據或庫出現異常 */ public class DataDoException extends RuntimeException{ public DataDoException(String msg) { super(msg); } }
package cn.com.cs.core.exception; /** * 業務層需要自己聲明異常的情況 */ public class ServiceException extends RuntimeException{ public ServiceException(String msg) { super(msg); } }
#developEnvironment spring: mvc: throw-exception-if-no-handler-found: true resources: add-mappings: false
#出現錯誤時, 直接拋出異常
spring.mvc.throw-exception-if-no-handler-found=true
#不要為我們工程中的資源文件建立映射
spring.resources.add-mappings=false
************************
博主給自己的小程序打個廣告,支付寶搜索: 天天購物助手
淘寶,天貓購物最高返利謝謝大家使用支持。