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
springBoot 全局异常捕捉(里面包含个各种常见异常)
最新推荐文章于 2024-09-19 14:55:31 发布