gpt4 book ai didi

java - 为什么这个初始化和配置的 Dispatcher Servlet 不处理任何请求?

转载 作者:行者123 更新时间:2023-12-02 03:05:03 26 4
gpt4 key购买 nike

我正在开发一个库,需要在使用该库的应用程序的 Web 应用程序上下文上注册其 Controller bean。以便应用程序可以访问库的 Controller 和配置 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。这是否意味着创建的第一个调度程序是唯一调用的调度程序?

最佳答案

您的第二个调度程序应该实现WebApplicationInitializer:

public class CustomConfJavaInitializer 
implements WebApplicationInitializer {

关于java - 为什么这个初始化和配置的 Dispatcher Servlet 不处理任何请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57027875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com