Zuul的异常处理
Spring Cloud Zuul对异常的处理是非常方便的,但是由于Spring Cloud处于迅速发展中,各个版本之间有所差异,本案例是以Finchley.RELEASE版本为例,来说明Spring Cloud Zuul中的异常处理问题。
1. Zuul请求的生命周期图

1.正常情况下所有的请求都是按照pre、route、post的顺序来执行,然后由post返回response
2.在pre阶段,如果有自定义的过滤器则执行自定义的过滤器
3.pre、routing、post的任意一个阶段如果抛异常了,则执行error过滤器
2. 异常处理(两种方式)
2.1 禁用默认SendErrorFilter过滤器,自定义ErrorFilter过滤器
禁用zuul的默认异常处理SendErrorFilter过滤器,定义我们自己的ErrorFilter过滤器
2.1.1 配置文件yml Filter
# 覆盖掉SendErrorFilter过滤器
# 使用自定义 ErrorFilter过滤器
zuul:
SendErrorFilter:
error:
disable: true
@Component
public class ErrorFilter extends ZuulFilter {
//日志
private static final Logger LOGGER = LoggerFactory.getLogger(ErrorFilter.class);
//类型是错误
@Override
public String filterType() {
return "error";
}
//顺序为 1
@Override
public int filterOrder() {
return 1;
}
//使用的过滤器
@Override
public boolean shouldFilter() {
return true;
}
//过滤器业务逻辑
@Override
public Object run() throws ZuulException {
try {
//获取 Request上下文
RequestContext context = RequestContext.getCurrentContext();
//获取异常
ZuulException exception = (ZuulException)context.getThrowable();
//记录日志进入系统异常拦截
LOGGER.error("进入系统异常拦截”",exception) ;
//获取 response对象
HttpServletResponse response = context.getResponse();
//response对象 设置格式
response.setContentType("application/json; charset=utf8");
//response对象 设置状态
response.setStatus(exception.nStatusCode) ;
//输出
PrintWriter writer = null;
try {
writer = response.getWriter();
writer.print("{code:" + exception.nStatusCode + ",message:\"" + exception.getMessage());
} catch (IOException e){
e.printStackTrace();
} finally {
if (writer != null){
writer.close();
}
}
} catch (Exception var5){
ReflectionUtils.rethrowRuntimeException(var5);
}
return null;
}
}
2.1.2 没有异常我们人为构造一个异常

2.1.3 测试结果



2.2 自定义全局error错误页面
自定义全局Error 和 上述 自定义ErrorFilter过滤器 不要一起使用
创建一个controller 继承ErrorController
//表示返回json
@RestController
public class ErrorHandlerController implements ErrorController {
/**
* 出异常后进入该方法,交由下面方法处理
* @return
*/
@Override
public String getErrorPath() {
return "/error";
}
@RequestMapping("/error")
public Object error(){
RequestContext currentContext = RequestContext.getCurrentContext();
ZuulException throwable = (ZuulException) currentContext.getThrowable();
return throwable.nStatusCode + "--" + throwable.getMessage();
}
}

1270

被折叠的 条评论
为什么被折叠?



