一、背景知识
在开发过程中,定义一套统一的错误码以及错误信息对于后续的使用和协作有很大的帮助,这笔帮助在项目人员的交流、定位问题、维护代码等方面会发挥至关重要的作用。
Spring Boot 是一个优秀的开源框架,同样也提供了很多途径来自定义错误码以及错误信息,因此本文打算讲解一下如何在 Spring Boot 中自定义返回错误码和错误消息的过程。
二、应用场景
对于一个后端 RESTful API 的服务来说,我们可以在以下情况中使用自定义错误码和错误消息的功能:
-
API请求的参数不合法,返回错误原因和错误码;
-
在业务逻辑处理过程中产生了异常,返回异常信息和异常码;
-
用户进行的操作需要特定的权限,请求未能通过权限检查,返回 403 错误码和错误信息。
以上情况只是示例,具体应用场景可能更加丰富和复杂,但是通过这些场景就可以简单而清晰地理解为什么需要自定义错误码和错误信息。
三、实现过程
在 Spring Boot 中实现自定义错误码和错误信息需要对以下两个类进行处理:
-
自定义异常类 ErrorInfoException ;
-
异常处理类 CustomExceptionHandler 。
下面,针对以上两个类分别进行详细的讲解。
3.1 自定义异常类 ErrorInfoException
为了方便返回错误码和错误信息,我们需要构造一个自定义的异常类 ErrorInfoException 。以下是一个示例代码:
public class ErrorInfoException extends RuntimeException {
private static final long serialVersionUID = 1L;
private ErrorCode errorCode;
public ErrorInfoException(ErrorCode errorCode) {
this.errorCode = errorCode;
}
public ErrorCode getErrorCode() {
return errorCode;
}
}
在代码中,我们定义了一个 ErrorCode 类型的参数 errorCode ,用于表示错误码,以及一个 getErrorCode() 方法用于获取错误码的值。
同时我们继承了 RuntimeException,因为该类是非受检异常,这将使我们可以在任何时候抛出该异常。
注意,这里我们以枚举类型的方式定义了错误码以及错误信息,在这个枚举中,我们可以自行定义应用的一些字符串常量。
以下是代码示例:
public enum ErrorCode {
MISSING_REQUEST_PARAM_ERROR(10000, "缺少请求参数"),
UNAUTHORIZED_ERROR(10001, "未授权错误"),
ACCOUNT_LOCKED_ERROR(10002, "账号被锁定"),
INVALID_REQUEST_PARAMETER_ERROR(10003, "请求参数无效"),
BAD_REQUEST_ERROR(10004, "无效的请求"),
THIRD_PARTY_API_FAILED(10005, "第三方api失败"),
...
private int code;
private String message;
private ErrorCode(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
}
以上是定义 ErrorCode 类型的枚举,枚举成员都是错误码,每个成员有一个 code 值和一个 message 值。
3.2 异常处理类 CustomExceptionHandler
为了统一处理自定义错误码和错误信息的获取和返回,我们需要一个异常处理类 CustomExceptionHandler 来处理控制器中抛出的 ErrorInfoException,并将错误码包装响应的 HttpResponse 中。以下是一个示例代码:
@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(CustomExceptionHandler.class);
@ExceptionHandler(ErrorInfoException.class)
@ResponseBody
ResponseEntity<ErrorResponse> handleControllerException(HttpServletRequest request, Throwable ex) {
logger.info("发生了异常!原因是:{},{}", ex.getMessage(), ex.getCause());
ErrorInfoException errorInfoException = (ErrorInfoException)ex;
ErrorCode errorCode = errorInfoException.getErrorCode();
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setErrorCode(errorCode.getCode());
errorResponse.setErrorMessage(errorCode.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(Exception.class)
@ResponseBody
ResponseEntity<ErrorResponse> handleControllerException(HttpServletRequest request, Exception ex) {
logger.info("发生了异常!原因是:{},{}", ex.getMessage(), ex.getCause());
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setErrorCode(500);
errorResponse.setErrorMessage("服务器内部错误");
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
在代码中,我们定义了一个异常处理类 CustomExceptionHandler 用于捕获用户自定义的异常 ErrorInfoException,并将信息包装成我们自定义的 ErrorResponse 响应对象。
在 handleControllerException 方法中,我们先判断异常类型,如果是 ErrorInfoException 类型,则从异常中获取错误码 errorCode , 调用它的 getCode() 方法和 getMessage() 方法来得到异常信息,然后将它们赋给响应对象 ErrorResponse 并返回。
如果是其他类型异常,则返回服务器内部错误代码 500 和错误信息 “服务器内部错误”。
注意,我们使用了 @ControllerAdvice 注解来指定当前类为全局异常处理类,从而捕获任意控制器中可能出现的异常。
四、示例:使用自定义返回错误码和错误信息的功能
接下来,我们为上述实现过程提供两个简单的示例,以说明如何在 Spring Boot 中使用自定义错误码和错误信息的功能。
4.1 示例 1:API请求的参数不合法,返回错误原因和错误码
在我们的请求参数缺失或无效时,我们可以使用自定义错误码来解决这个问题。以下是示例代码:
@RequestMapping(value="/user", method = RequestMethod.POST)
public ResponseEntity<User> createUser(@RequestBody User user) {
if(user.getUsername() == null) {
throw new ErrorInfoException(ErrorCode.INVALID_REQUEST_PARAMETER_ERROR);
}
...
}
在代码中,我们使用了自定义异常类 ErrorInfoException , 并使用枚举 INVALID_REQUEST_PARAMETER_ERROR 作为异常的错误码,来表示请求参数无效的错误。
如果发生该异常,则会对该异常进行捕获并给出错误码和错误信息。
4.2 示例 2:在业务逻辑处理过程中产生了异常,返回异常信息和异常码
在我们的业务逻辑处理过程中发生异常时,我们同样需要使用自定义错误码来解决这个问题。以下是示例代码:
public ResponseEntity<String> execute() {
try {
...
} catch (Exception ex) {
throw new ErrorInfoException(ErrorCode.THIRD_PARTY_API_FAILED);
}
}
在代码中,我们在执行业务逻辑时,如果发生异常将抛出 ErrorInfoException 异常,并使用枚举 THRID_PARTY_API_FAILED 作为异常的错误码,来表示第三方 api 调用失败。
如果发生该异常,则会对该异常进行捕获并给出错误码和错误信息。
五、总结
本文详细讲解了如何在 Spring Boot 中自定义返回错误码和错误信息的过程,包括自定义异常类 ErrorInfoException 和 异常处理类 CustomExceptionHandler,最后通过两个实例来说明它的应用场景以及它的优点特色。
在项目开发过程中,我们应该清晰地把握每一个细节,并结合实际应用需求进行改进和开发,以实现优秀的工业应用。
谢谢大家!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot 如何自定义返回错误码错误信息 - Python技术站