4

我的问题类似于这个Embedded Tomcat Integrated With Spring。我想在嵌入式 Tomcat 上运行 Spring MVC Dispatcher Servlet。但我总是以异常结束,说 WebApplicationObjectSupport 实例不在 ServletContext 中运行。我的示例只有两个类:

 class Application {
    public static void main(String[] args) throws LifecycleException, ServletException {
        try (AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext()) {
            context.registerShutdownHook();
            context.register(WebConfig.class);
            context.refresh();
            Tomcat tomcat = new Tomcat();
            tomcat.setPort(9090);
            File base = new File("");
            System.out.println(base.getAbsolutePath());
            Context rootCtx = tomcat.addWebapp("", base.getAbsolutePath());
            DispatcherServlet dispatcher = new DispatcherServlet(context);
            Tomcat.addServlet(rootCtx, "SpringMVC", dispatcher);
            rootCtx.addServletMapping("/*", "SpringMVC");
            tomcat.start();
            tomcat.getServer().await();
        }
    }
}


@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/assets/");
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("redirect:index.html");
    }
}

我如何必须通过调用 tomcat.addWebApp(..) 方法以不同的方式定义 servlet 上下文?有没有人有一个示例如何将 Spring MVC 调度程序与嵌入式 tomcat 一起使用但没有引导?

4

1 回答 1

0

您可以通过以下方式创建ServletContextInitializer并潜入@Configuration

@Configuration
class WebAppInitConfig implements ServletContextInitializer {
    @Override
    void onStartup(ServletContext context) {
        AnnotationConfigWebApplicationContext webAppContext = new AnnotationConfigWebApplicationContext()
        webAppContext.register(RootConfig)
        webAppContext.registerShutdownHook()

        ServletRegistration.Dynamic dispatcher = context.addServlet("dispatcher", new DispatcherServlet(webAppContext))
        dispatcher.loadOnStartup = 1
        dispatcher.addMapping("/*")
        // Whatever else you need
    }
}
于 2018-05-24T20:13:38.897 回答