【发布时间】: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