使用 web.xml 配置 spring-boot 应用程序
Posted
技术标签:
【中文标题】使用 web.xml 配置 spring-boot 应用程序【英文标题】:Configuring a spring-boot application using web.xml 【发布时间】:2013-10-03 21:44:47 【问题描述】:我正在启动现有的 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 构建脚本进行了一些更改以使其正常工作:
向 spring-boot-starter 和 spring-boot-starter-jetty 添加依赖项 spring-boot 插件的配置应用程序启动正常,控制器已加载,我可以查询服务器。但是 web.xml 中定义的过滤器都没有启用。
现在我想删除JettyApplication.java
中PropertiesConfiguration.class
、ApplicationConfiguration.class
和SpringDispatcherServletConfiguration.class
的导入,并通过将web.xml
的内容加载或导入到嵌入式servlet 容器中以某种方式替换它们。但我忽略了这是否是一个正确的策略,如果我能做到。我将不胜感激。
-- 解决方案
这是根据 Dave 的回答得出的最终 JettyApplication.class
:
package com.fbecart;
import org.eclipse.jetty.servlets.GzipFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.DispatcherServlet;
@Configuration
@Import( ApplicationConfiguration.class, SpringDispatcherServletConfiguration.class,
EmbeddedServletContainerAutoConfiguration.class )
public class JettyApplication
public static void main(String[] args) throws Exception
SpringApplication.run(JettyApplication.class, args);
@Bean
public DispatcherServlet dispatcherServlet()
return new MyDispatcherServlet();
@Bean
public GzipFilter gzipFilter()
return new GzipFilter();
@Bean
public CharacterEncodingFilter characterEncodingFilter()
final CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return characterEncodingFilter;
@Bean
public OpenEntityManagerInViewFilter openEntityManagerInViewFilter()
return new OpenEntityManagerInViewFilter();
我将在不久的将来用 ServletContainerInitializer 替换 web.xml...敬请期待 ;)
【问题讨论】:
你的项目在某处可用吗(来源)我有同样的任务要做,我找不到很好的例子...... 对不起,查拉图斯特拉,这是一个闭源项目。但是,如果它可以帮助你,我可以分享一些特定的代码。 @Florent Bécart 我创建了一个新主题:***.com/questions/21115205/… 【参考方案1】:如果我是你,我会慢慢尝试剥离 web.xml 中的层并将其完全删除。这样,您将只有一个配置用于整个应用程序,包括所有过滤器和 servlet(无论如何都是这个想法)。您可以在稳定过滤器在 web.xml 中重复的位置时进行一些并行运行,然后当您在主应用程序中具有相同的功能时,您可以删除 web.xml。要向主应用程序添加过滤器,只需为 Filter
或 FilterRegistrationBean
实例创建 @Bean 定义。
如果需要,您也可以随时通过SpringBootServletInitializer
支持战争部署。
【讨论】:
感谢您的快速回答,并很抱歉首先在 Twitter 上打扰您 ;) 我完全放弃 web.xml 的障碍是缺少用于会话超时设置的 Servlet api,为此我需要覆盖默认设置。 我不记得在 Spring Boot 中看到过拉取请求(讽刺),甚至是功能请求?肯定有你可以使用的特定于容器的 API 吗?还是出于某种原因你想继续打仗?以上是关于使用 web.xml 配置 spring-boot 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
在 spring-boot Web 应用程序中未考虑 web.xml 会话超时?
Spring-Boot使用嵌入式容器,那怎么配置自定义Filter呢
intellij idea 2017 gradle构建spring-boot web项目