我正在启动现有的Spring Web应用程序,因此生成的war文件嵌入了Jetty Web服务器。我想尽可能地坚持现有的配置,以限制回归。
以下是现有的web.xml
:
<web-app id="fbecart-webapp" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.fbecart.ApplicationConfiguration</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>spring-dispatcher</servlet-name>
<servlet-class>com.fbecart.MyDispatcherServlet</servlet-class>
<init-param>
<param-name>dispatchOptionsRequest</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.fbecart.SpringDispatcherServletConfiguration</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-dispatcher</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>GzipFilter</filter-name>
<filter-class>org.eclipse.jetty.servlets.GzipFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>GzipFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
这是我的主要课程JettyApplication.java
:
package com.fbecart;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import({ ApplicationConfiguration.class, SpringDispatcherServletConfiguration.class,
EmbeddedServletContainerAutoConfiguration.class })
public class JettyApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(JettyApplication.class, args);
}
}
我对Gradle构建脚本进行了一些更改以使其正常工作:
应用程序启动正常,控制器已加载,我可以查询服务器。但是没有启用web.xml中定义的过滤器。
现在我想删除PropertiesConfiguration.class
中ApplicationConfiguration.class
,SpringDispatcherServletConfiguration.class
和JettyApplication.java
的导入,并以某种方式通过加载或导入{{1}的内容来替换它们进入嵌入式servlet容器。但我忽略了,如果这是一个正确的策略,如果我能做到的话。我非常感谢任何帮助。
- 解决方案
以下是基于戴夫答案的最终web.xml
:
JettyApplication.class
我将在不久的将来用ServletContainerInitializer替换web.xml ...敬请关注;)
答案 0 :(得分:8)
如果我是你,我会慢慢尝试剥离web.xml中的图层并完全删除它。这样,整个应用程序只有一个配置,包括所有过滤器和servlet(无论如何都是这个想法)。您可以在稳定在web.xml中复制过滤器的位置时执行某些并行运行,然后在主应用程序中具有相同的功能时,您可以删除web.xml。要向主应用程序添加过滤器,只需为Filter
或FilterRegistrationBean
实例创建@Bean定义。
如果需要,您也可以随时通过SpringBootServletInitializer
支持战争部署。