【问题标题】:Why is this initialized and configured Dispatcher Servlet not processing any request?为什么这个初始化和配置的 Dispatcher Servlet 不处理任何请求?
【发布时间】:2019-11-23 10:56:10
【问题描述】:

我正在开发一个需要在使用该库的应用程序的 Web 应用程序上下文中注册其控制器 bean 的库。这样应用程序就可以访问库的控制器和配置 bean。

应用程序已经在使用 servlet 初始化程序:(我无法修改应用程序源代码)

@Order(1)
public class ServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    /** Constructor */
    public SpringServletInitializer() {
    }

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringCoreConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringWebConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        return new Filter[]{characterEncodingFilter};
    }

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        servletContext.setInitParameter("spring.profiles.default", "ADMIN_PROFILE");
        super.onStartup(servletContext);
    }

}

我尝试通过扩展AbstractAnnotationConfigDispatcherServletInitializer 或实现WebApplicationInitializer 来创建一个新的DispatcherServlet。但是在这两种方式中,即使新的 DispatcherServlet 已成功初始化和配置,也永远不会被调用。应用程序仍然使用它自己的调度器 servlet,而不是两者都使用。

public class CustomConfJavaInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(CustomApiConfiguration.class);
        ctx.setServletContext(servletContext);

        ServletRegistration.Dynamic servlet = servletContext.addServlet(
                "dispatcher2", new DispatcherServlet(ctx));

        servlet.setLoadOnStartup(1);
        servlet.addMapping("/custom");
    }
}


要么

public class CustomConfJavaInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        servletContext.setInitParameter("spring.profiles.default", "ADMIN_PROFILE");
        super.onStartup(servletContext);
    }

      @Override
      protected Class<?>[] getRootConfigClasses() {
        return null;
      }

      @Override
      protected Class<?>[] getServletConfigClasses() {
        return new Class[]{CustomApiConfiguration.class};
      }


      @Override
      protected String getServletName() {
        return "dispatcher2";
      }


    @Override
    protected String[] getServletMappings() {
        return new String[]{"/", "/custom", "/custom/*"};
    }   

}

我宁愿只修改默认调度程序 servlet 并添加我的配置,但我不确定我该怎么做?

org.springframework.web.servlet.DispatcherServlet|DispatcherServlet with name 'dispatcher' processing GET request for [/app-back/custom/ping]
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping|Matching patterns for request [/custom/ping] are [/**]
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping|URI Template variables for request [/custom/ping] are {}

但是,既然我们被允许有多个 Dispatcher Servlet,为什么从来没有调用过“dispatcher2”?
我尝试扩展ServletInitializer,所以我的课程首先被调用,它似乎确实有效。我的 dispatcher2 会为每个请求调用,但不会调用它们的 Dispatcher Servlet dispatcher。这是否意味着创建的第一个调度程序是唯一调用的调度程序?

【问题讨论】:

    标签: java spring spring-mvc servlets servlet-3.0


    【解决方案1】:

    你的第二个调度员应该实现WebApplicationInitializer

    public class CustomConfJavaInitializer 
       implements WebApplicationInitializer {
    

    【讨论】:

    • 我已经在课堂上尝试过 CustomApiInitializer。还是您的意思是在我的CustomConfJavaInitializer 类中同时实现WebApplicationInitializer 和扩展AbstractAnnotationConfigDispatcherServletInitializer
    • @redAce 你应该有不同的名字并且都实现WebApplicationInitializer
    • 我尝试在我的CustomConfJavaInitializer 类中实现WebApplicationInitializer,但结果相同。创建的第一个调度程序始终是被调用的调度程序。
    • @redAce 您是否更改了getServletName 以返回不同的值?
    • 是的,调度员和调度员2。
    猜你喜欢
    • 2020-11-21
    • 2015-05-13
    • 2015-11-09
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多