转发期间Zuul SendErrorFilter出错

时间:2015-08-09 14:42:54

标签: netflix-zuul

当我的Zuul过滤器无法路由到已配置的网址时,' RibbonRoutingFilter' class抛出一个ZuulException,说" Forwarding error"并且控件转到' SendErrorFilter'类。

现在,当SendErrorFilter类尝试执行转发时,在此转发呼叫期间会发生另一个异常。

dispatcher.forward(ctx.getRequest(), ctx.getResponse());

此前转呼叫期间发生的异常是

Caused by: java.lang.IllegalArgumentException: UT010023: Request org.springframework.cloud.netflix.zuul.filters.pre.Servlet30WrapperFilter$Servlet30RequestWrapper@6dc974ea was not original or a wrapper
    at io.undertow.servlet.spec.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:103) ~[undertow-servlet-1.1.3.Final.jar:1.1.3.Final]
    at org.springframework.cloud.netflix.zuul.filters.post.SendErrorFilter.run(SendErrorFilter.java:74) ~[spring-cloud-netflix-core-1.0.0.RELEASE.jar:1.0.0.RELEASE]
    at com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:112) ~[zuul-core-1.0.28.jar:na]
    at com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:197) ~[zuul-core-1.0.28.jar:na]

最后当控件来到我的自定义ZuulErrorFilter时,我没有得到原始异常。相反,我得到的异常对象是在转发期间发生的异常对象。

更新        我发现可以将errorPath属性配置为指向错误处理服务。如果未配置,Zuul默认查找名为/ error的服务并尝试分派给该服务。由于我们没有/ error的任何服务,dispatcher.forward()抛出了错误。

问题      我们如何跳过这个fwd到错误处理服务?我们有一个ErrorFilter来记录错误。我们不希望有错误处理服务。

1 个答案:

答案 0 :(得分:1)

我们遇到了同样的问题,并且有一个简单的解决方案可以修复Undertow“吃掉”原始异常,跟随我的博客帖子:

http://blog.jmnarloch.io/2015/09/16/spring-cloud-zuul-error-handling/

您需要将标志allow-non-standard-wrappers设置为true。在Spring Boot中,通过注册自定义UndertowDeploymentInfoCustomizer可以实现这一点。例如:

@Bean
public UndertowEmbeddedServletContainerFactory embeddedServletContainerFactory() {
    UndertowEmbeddedServletContainerFactory factory = new UndertowEmbeddedServletContainerFactory();
    factory.addDeploymentInfoCustomizers(new UndertowDeploymentInfoCustomizer() {
        @Override
        public void customize(DeploymentInfo deploymentInfo) {
            deploymentInfo.setAllowNonStandardWrappers(true);
        }
    });
    return factory;
}

现在关于这个问题,无论哪种方式我都强烈建议您实现自己的ErrorController,否则您可能会遇到奇怪的Spring Boot行为(在我们的设置中 - 默认情况下总是生成具有200 HTTP状态的Whitelabel错误页面代码 - 在Tomcat中从不发生矛盾)并且以这种方式不能被AJAX调用消耗。

相关Github问题:https://github.com/spring-cloud/spring-cloud-netflix/issues/524