当我的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来记录错误。我们不希望有错误处理服务。
答案 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