参考链接
版本
org.springframework.cloud
spring-cloud-starter-gateway
2.1.5.RELEASE
现有项目网关部分结构图
image.png
整体项目基于 spring-cloud-alibaba 搭建,后端服务以spring boot为主框架,内部服务以RESTful开放调用,网关部分以spring cloud gateway为核心组件。
现有结构产生如下问题:
Spring cloud gateway以WebFlux形式作为底层框架,类似Spring boot的全局异常处理方案在该组件中失效。
Spring cloud gateway默认错误信息以html形式返回,这样在项目结构中就存在RESTful api和html两种形式返回错误信息。
处理方案
实现自定义ExceptionHandler,继承DefaultErrorWebExceptionHandler
增加ErrorHandlerConfiguration,并注入
调整部分
@Override
protected Map getErrorAttributes(ServerRequest request, boolean includeStackTrace) {
int code = 500;
Throwable error = super.getError(request);
if (error instanceof ResponseStatusException) {
code = ((ResponseStatusException) error).getStatus().value();
}
// 获取自定义异常处理机制
if (error instanceof BusinessException) {
code = ((BusinessException) error).getBusinessResponseInter().getCode();
}
return response(code, this.buildMessage(request, error));
}