Spring boot - 自定义 rest controller 异常处理 HTTP 状态
Spring boot - custom rest controller exception handling HTTP status
我已经为我的 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
);
}
}
...我处理验证、业务(由于违反业务规则而导致的异常)和技术(数据库相关、无效请求参数等)异常。
异常类有两个参数:errorCode(唯一枚举)和message(异常详细信息)。
正如您从示例中看到的,对于所有情况,我都是 return BAD_REQUEST (400) 状态,这不是最佳做法。
我想知道根据异常类别处理 HTTP 状态的最佳方法,例如:对于验证错误 returning BAD_REQUEST (400) 状态是 "okay" .
...或者有什么方法可以让 spring-boot "decides" 发送哪个状态码?
由于应用程序中的错误类型可能不同,并且不可能为所有这些错误提供通用的 HTTP 状态,因此我通过创建将错误代码映射到 HTTP 状态的自定义映射器解决了这个问题。
由于错误代码是唯一的,并且每个错误代码都用于特殊的异常处理,因此我可以将错误代码映射到 Http 状态。
您始终可以在 Exception 和 Handler 中设置 HttpStatus 属性,只需获取状态值并在 ResponseEntity 中配置它。基本上 HttpStatus 取决于执行任务的上下文。您的技术或业务异常可以 return 400、404、409 等。我认为好的解决方案是在抛出合适的异常期间定义 HttpStatus。
如果你不想为每个 HttpStatus 定义很多异常,你可以使用 org.springframework.web.server.ResponseStatusException.
从 java 和 spring 方面,使用 @ControllerAdvice 和 @ExceptionHandler 是最佳实践。
从错误码的取值来看,没有标准。但你可以:
1。关注old https code status standard
- 1xx 信息响应 – 请求已收到,继续处理
- 2xx 成功 – 请求被成功接收、理解并接受
- 3xx 重定向 – 需要采取进一步的操作才能完成请求
- 4xx 客户端错误 – 请求包含错误语法或无法实现
- 5xx 服务器错误 – 服务器未能完成明显有效的请求
2。从世界 Class 家公司
复制
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
我已经为我的 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
);
}
}
...我处理验证、业务(由于违反业务规则而导致的异常)和技术(数据库相关、无效请求参数等)异常。
异常类有两个参数:errorCode(唯一枚举)和message(异常详细信息)。
正如您从示例中看到的,对于所有情况,我都是 return BAD_REQUEST (400) 状态,这不是最佳做法。
我想知道根据异常类别处理 HTTP 状态的最佳方法,例如:对于验证错误 returning BAD_REQUEST (400) 状态是 "okay" .
...或者有什么方法可以让 spring-boot "decides" 发送哪个状态码?
由于应用程序中的错误类型可能不同,并且不可能为所有这些错误提供通用的 HTTP 状态,因此我通过创建将错误代码映射到 HTTP 状态的自定义映射器解决了这个问题。
由于错误代码是唯一的,并且每个错误代码都用于特殊的异常处理,因此我可以将错误代码映射到 Http 状态。
您始终可以在 Exception 和 Handler 中设置 HttpStatus 属性,只需获取状态值并在 ResponseEntity 中配置它。基本上 HttpStatus 取决于执行任务的上下文。您的技术或业务异常可以 return 400、404、409 等。我认为好的解决方案是在抛出合适的异常期间定义 HttpStatus。 如果你不想为每个 HttpStatus 定义很多异常,你可以使用 org.springframework.web.server.ResponseStatusException.
从 java 和 spring 方面,使用 @ControllerAdvice 和 @ExceptionHandler 是最佳实践。
从错误码的取值来看,没有标准。但你可以:
1。关注old https code status standard
- 1xx 信息响应 – 请求已收到,继续处理
- 2xx 成功 – 请求被成功接收、理解并接受
- 3xx 重定向 – 需要采取进一步的操作才能完成请求
- 4xx 客户端错误 – 请求包含错误语法或无法实现
- 5xx 服务器错误 – 服务器未能完成明显有效的请求
2。从世界 Class 家公司
复制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