Spring 引导 - 自定义 rest 控制器异常处理 HTTP 状态



我已经为我的 Spring 启动应用程序创建了一个自定义的 REST 控制器异常处理程序......

@ControllerAdvice(annotations = RestController.class)
public class RestControllerExceptionHandler {    
@ExceptionHandler(TechnicalException.class)
public ResponseEntity handleTechnicalException(TechnicalException e) {    
return new ResponseEntity<>(
new RestErrorMessageModel(e.getErrorCode(), e.getMessage()), BAD_REQUEST
);
}
@ExceptionHandler(BusinessException.class)
public ResponseEntity handleBusinessException(BusinessException e) {    
return new ResponseEntity<>(
new RestErrorMessageModel(e.getErrorCode(), e.getMessage()), BAD_REQUEST
);
}
@ExceptionHandler(ValidationException.class)
public ResponseEntity handleValidationException(ValidationException e) {    
return new ResponseEntity<>(
new RestErrorMessageModel(e.getErrorCode(), e.getDetails()), BAD_REQUEST
);
}
}

。我处理验证、业务(由于违反业务规则而导致的异常(和技术(数据库相关、无效请求参数等(异常的地方。

异常类有两个参数:错误代码(唯一枚举(和消息(异常详细信息(。

从示例中可以看出,对于所有情况,我都返回BAD_REQUEST (400( 状态,这不是最佳做法。

我想知道根据异常类别处理HTTP状态的最佳方法,例如:对于返回BAD_REQUEST(400(状态的验证错误为"正常"。

。或者有什么方法可以让 spring-boot "决定"发送哪个状态代码?

从java和spring的角度来看,使用@ControllerAdvice和@ExceptionHandler是最佳实践。

从错误代码的值来看,没有标准。但您可以:

1. 遵循旧的 https 代码状态标准

  • 1xx 信息响应 – 请求已收到,继续处理
  • 2xx 成功 – 请求已成功接收、理解和接受
  • 3xx 重定向 – 需要采取进一步操作才能完成请求
  • 4xx 客户端错误 – 请求包含错误的语法或无法实现
  • 5xx 服务器错误 – 服务器无法满足看似有效的请求

阿拉伯数字。复制自世界级公司

https://developer.paypal.com/docs/api/reference/api-responses/#http-status-codes

3. 在不与 http 旧标准冲突的情况下实现自己的代码

https://developer.paypal.com/docs/classic/api/errors/#10000-to-10099

由于应用程序的错误类型可能有所不同,并且不可能为所有这些错误提供通用的HTTP状态,因此我通过创建自定义映射器将错误代码映射到HTTP状态来解决它。

由于错误代码是唯一的,并且每个错误代码都用于特殊的异常处理,因此我可以将错误代码映射到 Http 状态。

您始终可以在异常中设置 HttpStatus 属性,而在处理程序中只需获取状态值并在响应实体中对其进行配置即可。基本上,HttpStatus取决于已执行任务的上下文。您的技术或业务异常可以返回 400、404、409 等。我认为好的解决方案是在抛出合适的异常期间定义 HttpStatus。 如果您不想为每个 HttpStatus 定义许多 Exception,则可以使用 org.springframework.web.server.ResponseStatusException。

最新更新