当前位置: 首页 > 知识库问答 >
问题:

org.springframework.boot.web.servlet.error.错误ontroller.get错误路径()

竺和洽
2023-03-14

我的应用程序使用spring boot版本2.5.0和spring cloud starter netflix zuul 2.2.8。释放

在最新的spring boot版本2.5.0中,getErrorPath()API从ErrorController中删除,但最新的spring cloud starter netflix zuul 2.2.8。RELEASE仍调用此API并导致此错误

有人遇到同样的问题并已经解决了吗

2021-06-23 19:36:31 o.a.c.c.C.[.[localhost] [ERROR] Exception Processing ErrorPage[errorCode=0, location=/error]
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: 'java.lang.String org.springframework.boot.web.servlet.error.ErrorController.getErrorPath()'
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1078)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:106)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:121)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:115)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:87)
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103)
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:710)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
    at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:398)
    at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:257)
    at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:352)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:177)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.NoSuchMethodError: 'java.lang.String org.springframework.boot.web.servlet.error.ErrorController.getErrorPath()'
    at org.springframework.cloud.netflix.zuul.web.ZuulHandlerMapping.lookupHandler(ZuulHandlerMapping.java:87)
    at org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.getHandlerInternal(AbstractUrlHandlerMapping.java:152)
    at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:498)
    at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1257)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039)
    ... 72 common frames omitted

共有3个答案

逄皓轩
2023-03-14

为什么会出现这个问题?

  • 出现此问题是因为zuul和功能区已从2.5. x中的springboot主通道中删除。

我们如何解决这个问题?

>

  • 将:Zuul(Api网关)替换为Spring Cloud gateway,将Ribbon(负载平衡器)替换为Spring Cloud Loadbalancer。您可以通过此博客获取说明:https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now#spring-云网飞项目进入维护模式

    使用@Configuration注释创建Bean:

    • 创建一个ZuulConfiguration.java类并使用以下代码:
    @Configuration
    public class ZuulConfiguration {
    
        /** The path returned by ErrorContoller.getErrorPath() with Spring Boot < 2.5 (and no longer available on Spring Boot >= 2.5). */
        private static final String ERROR_PATH = "/error";
    
        /**
         * Constructs a new bean post-processor for Zuul.
         * 
         * @param routeLocator
         *            the route locator.
         * @param zuulController
         *            the Zuul controller.
         * @param errorController
         *            the error controller.
         * @return the new bean post-processor.
         */
        @Bean
        public ZuulPostProcessor zuulPostProcessor(@Autowired RouteLocator routeLocator, @Autowired ZuulController zuulController,
                @Autowired(required = false) ErrorController errorController) {
            return new ZuulPostProcessor(routeLocator, zuulController, errorController);
        }
    
        private static final class ZuulPostProcessor implements BeanPostProcessor {
    
            private final RouteLocator routeLocator;
    
            private final ZuulController zuulController;
    
            private final boolean hasErrorController;
    
            ZuulPostProcessor(RouteLocator routeLocator, ZuulController zuulController, ErrorController errorController) {
                this.routeLocator = routeLocator;
                this.zuulController = zuulController;
                this.hasErrorController = (errorController != null);
            }
    
            @Override
            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                if (hasErrorController && (bean instanceof ZuulHandlerMapping)) {
                    Enhancer enhancer = new Enhancer();
                    enhancer.setSuperclass(ZuulHandlerMapping.class);
                    enhancer.setCallbackFilter(LookupHandlerCallbackFilter.INSTANCE); // only for lookupHandler
                    enhancer.setCallbacks(new Callback[] { LookupHandlerMethodInterceptor.INSTANCE, NoOp.INSTANCE });
                    Constructor<?> ctor = ZuulHandlerMapping.class.getConstructors()[0];
                    return enhancer.create(ctor.getParameterTypes(), new Object[] { routeLocator, zuulController });
                }
                return bean;
            }
    
        }
    
        private static enum LookupHandlerCallbackFilter implements CallbackFilter {
    
            INSTANCE;
    
            @Override
            public int accept(Method method) {
                if ("lookupHandler".equals(method.getName())) {
                    return 0;
                }
                return 1;
            }
    
        }
    
        private static enum LookupHandlerMethodInterceptor implements MethodInterceptor {
    
            INSTANCE;
    
            @Override
            public Object intercept(Object target, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                if (ERROR_PATH.equals(args[0])) {
    
                    /* by entering this branch we avoid the ZuulHandlerMapping.lookupHandler method to trigger the NoSuchMethodError */
                    return null;
                }
                return methodProxy.invokeSuper(target, args);
            }
    
        }
    
    }
    
    • 解决方案链接https://gist.github.com/aldobongio/6a22f49863c7a777612f7887bbb8fd1d

  • 赖渊
    2023-03-14

    我也面临同样的问题,因为自2020年以来,spring cloud就不再支持zuul了

    spring-boot-starter-parent: 2.1.3.RELEASE
    java.version: 1.8
    spring-cloud.version: Greenwich.RELEASE
    spring-cloud-starter-netflix-zuul: 2.1.0.RELEASE
    spring-cloud-starter-netflix-eureka-client: 2.1.0.RELEASE
    jackson-dataformat-xml: 2.9.9
    spring-cloud-starter-netflix-eureka-server: 2.1.0.RELEASE
    
    侯令雪
    2023-03-14

    问题是组织之间的Spring版本冲突。springframework。云:spring cloud starter netflix zuul:2.2。x和Spring护套2.5。x

    这里提到的aldobongio的解决方法/修复对我有用:https://gist.github.com/aldobongio/6a22f49863c7a777612f7887bbb8fd1d

    这段代码创建了一个新的BeanPostProcessor,它围绕原始的ZuulHandlerMappingBean包装了一个自定义代理。此代理拦截lookupHandler方法的调用,阻止执行导致“NoSuchMethodError”的代码。

    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    import org.springframework.boot.web.servlet.error.ErrorController;
    import org.springframework.cglib.proxy.Callback;
    import org.springframework.cglib.proxy.CallbackFilter;
    import org.springframework.cglib.proxy.Enhancer;
    import org.springframework.cglib.proxy.MethodInterceptor;
    import org.springframework.cglib.proxy.MethodProxy;
    import org.springframework.cglib.proxy.NoOp;
    import org.springframework.cloud.netflix.zuul.filters.RouteLocator;
    import org.springframework.cloud.netflix.zuul.web.ZuulController;
    import org.springframework.cloud.netflix.zuul.web.ZuulHandlerMapping;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * Fix for Zuul configuration with Spring Boot 2.5.x + Zuul - "NoSuchMethodError: ErrorController.getErrorPath()":
     */
    @Configuration
    public class ZuulConfiguration {
      /**
       * The path returned by ErrorController.getErrorPath() with Spring Boot < 2.5
       * (and no longer available on Spring Boot >= 2.5).
       */
      private static final String ERROR_PATH = "/error";
      private static final String METHOD = "lookupHandler";
    
      /**
       * Constructs a new bean post-processor for Zuul.
       *
       * @param routeLocator    the route locator.
       * @param zuulController  the Zuul controller.
       * @param errorController the error controller.
       * @return the new bean post-processor.
       */
      @Bean
      public ZuulPostProcessor zuulPostProcessor(@Autowired RouteLocator routeLocator,
                                                 @Autowired ZuulController zuulController,
                                                 @Autowired(required = false) ErrorController errorController) {
        return new ZuulPostProcessor(routeLocator, zuulController, errorController);
      }
    
      private enum LookupHandlerCallbackFilter implements CallbackFilter {
        INSTANCE;
    
        @Override
        public int accept(Method method) {
          if (METHOD.equals(method.getName())) {
            return 0;
          }
          return 1;
        }
      }
    
      private enum LookupHandlerMethodInterceptor implements MethodInterceptor {
        INSTANCE;
    
        @Override
        public Object intercept(Object target, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
          if (ERROR_PATH.equals(args[0])) {
            // by entering this branch we avoid the ZuulHandlerMapping.lookupHandler method to trigger the 
            // NoSuchMethodError 
            return null;
          }
          return methodProxy.invokeSuper(target, args);
        }
      }
    
      private static final class ZuulPostProcessor implements BeanPostProcessor {
    
        private final RouteLocator routeLocator;
        private final ZuulController zuulController;
        private final boolean hasErrorController;
    
        ZuulPostProcessor(RouteLocator routeLocator, ZuulController zuulController, ErrorController errorController) {
          this.routeLocator = routeLocator;
          this.zuulController = zuulController;
          this.hasErrorController = (errorController != null);
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
          if (hasErrorController && (bean instanceof ZuulHandlerMapping)) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(ZuulHandlerMapping.class);
            enhancer.setCallbackFilter(LookupHandlerCallbackFilter.INSTANCE); // only for lookupHandler
            enhancer.setCallbacks(new Callback[] {LookupHandlerMethodInterceptor.INSTANCE, NoOp.INSTANCE});
            Constructor<?> ctor = ZuulHandlerMapping.class.getConstructors()[0];
            return enhancer.create(ctor.getParameterTypes(), new Object[] {routeLocator, zuulController});
          }
          return bean;
        }
      }
    }
    
     类似资料:
    • 日蚀开普勒4.3.0. v20130530-1801 Egit版本:3.0.0.201306101825-r 在启动Eclipse并检查错误日志后,我得到以下警告: EGit无法检测到本机Git的安装路径“gitPrefix”。因此EGit无法尊重可能在本机Git安装目录下的${gitPrefix}/etc/gitconfig中配置的系统级Git设置。这些设置中最重要的是core.autocrlf

    • Android Studio3.1.3未运行,显示错误,如下所示(图片)。我已经在“环境变量”中设置了jdk路径,但问题仍然存在。删除用户数据后重新安装Android Studio是没有帮助的。请发布其他替代方法来解决此问题。 附注-我已经将jdk版本从Android studio中的设置改成了更最新的版本(即1.6到1.8)。在A.S.重新启动时。问题开始了。 安装AS 2.1.3拆卸AS 3.

    • 我在后端工作,我有一个路由,它应该只从数据库返回一个ID数组,以便以后延迟加载。我的路线定义如下: 它应该返回这样的数组

    • 我通过xampp软件长期使用Mysql,运行良好。现在我安装了Mysql软件,在配置Mysql软件时,我给出了端口3307,在使用3306的Xampp中独立于Mysql运行它。但它不起作用,我运行xampp时遇到了以下错误,我得到了屏幕,上面写着以下错误 MySQL服务检测到错误路径更改XAMPP MySQL和控制面板设置或先手动卸载/禁用其他服务找到路径:"C:\Program Files\My

    • 我正在尝试搜索亚马逊的产品广告,并使用botlenose来帮助我做到这一点。但是,我刚刚收到HTTP错误400。 其他一些重要信息: 我来自巴西,我的标签也来自亚马逊。这是个问题吗? 我确实检查了我的钥匙、秘密和标签,一切正常。我确实在StackOverflow上查看了其他一些问题,但对我来说没有任何效果。 当然,出于安全原因,我更改了密钥。 Traceback(最近一次调用最后一次):File"

    • 问题内容: 我在调用ajax时遇到了laravel的路由问题,但是我真的不明白是什么原因导致的,因为我应该调用ajax并成功返回。任何帮助将不胜感激。谢谢! 这是我的ajax代码 这是我的路线 这是我的控制器方法 这是我得到的错误 Laravel日志 filters.php 问题答案: 您需要在AJAX调用的标头中包含CSRF令牌。试试这个: 在您的HTML 块中: 对于您的AJAX电话: 最后,