我有一个网络项目,我很容易在tomcat上解码它。事实上,我有一个实现WebAppInitializer
的{{1}}类(这个类真的很胖),因为你知道每个支持servlet 3.0的应用服务器,它可以轻松检测到它并尝试启动它。现在我想知道可以使用spring boot starter并且没有任何进一步的配置,我将WebApplicationInitializer
传递给它并根据我的WebAppInitializer
启动我的项目进行spring boot?
我只想使用spring-boot的方法在Tomcat上部署应用程序,我不想使用其他spring-boot的工具。
答案 0 :(得分:0)
如果已经使用Spring Servlet 3.0+初始化程序支持类,Servlet 3.0+应用程序可能很容易翻译。通常,现有WebApplicationInitializer中的所有代码都可以移动到SpringBootServletInitializer中。如果您的现有应用程序具有多个ApplicationContext(例如,如果它使用AbstractDispatcherServletInitializer),那么您可以将所有上下文源压缩到单个SpringApplication中。您可能遇到的主要复杂因素是,如果这不起作用,您需要维护上下文层次结构。有关示例,请参阅构建层次结构的条目。通常需要拆分包含特定于Web的功能的现有父上下文,以便所有ServletContextAware组件都位于子上下文中。
是的,这是可能的,但您需要将其转换为SpringBootServletInitializer
,这似乎非常相似。
答案 1 :(得分:0)
http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file精确地描述了如何做到这一点
答案 2 :(得分:0)
是的,这是一个古老的问题。但是我看不到一个可接受的答案,而最接近有效答案的答案只有指向外部资源的链接。所以就在这里。
28.4.2 Servlet上下文初始化
嵌入式Servlet容器不会直接执行Servlet 3.0+ javax.servlet.ServletContainerInitializer接口或Spring的 org.springframework.web.WebApplicationInitializer接口。这是 旨在降低第三种风险的故意设计决策 在战争中运行的第三方库可能会破坏Spring Boot 应用程序。
如果您需要在Spring Boot中执行servlet上下文初始化 应用程序,您应该注册一个实现 org.springframework.boot.web.servlet.ServletContextInitializer 接口。单一的onStartup方法提供了对 ServletContext,并且,如果需要,可以轻松地用作ServletAdapter 现有的WebApplicationInitializer。
扫描Servlet,过滤器和侦听器
使用嵌入式时 容器,自动注册带注释的类 可以使用以下方式启用@ WebServlet,@ WebFilter和@WebListener @ServletComponentScan。
[提示] @ServletComponentScan在独立容器中无效, 而是使用容器的内置发现机制。
我已经尝试过了。有效
在我的用例中,我有一个包含数十个webapp的项目,这些webapp旨在作为WAR在Tomcat上运行。 WebApplicationInitializers巧妙地制作了许多逻辑,似乎应该有一种更简单的方法来重用所有这些逻辑。将implements ServletContextInitializer
添加到这些初始化程序中,并通过@Configuration
类将它们作为bean公开,使用SpringBoot的嵌入式Tomcat点亮了我的Web服务器。