使用web.xml配置spring-boot应用程序 [英] Configuring a spring-boot application using web.xml

查看:4542
本文介绍了使用web.xml配置spring-boot应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在启动一个现有的Spring Web应用程序,以便生成的war文件嵌入一个Jetty Web服务器。



这里是现有的 web.xml

code>:

 < web-app id =fbecart-webappversion =2.4xmlns = http://java.sun.com/xml/ns/j2eexmlns:xsi =http://www.w3.org/2001/XMLSchema-instancexsi: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;
export 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中定义的过滤器被启用。



现在我想删除 PropertiesConfiguration.class ApplicationConfiguration.class SpringDispatcherServletConfiguration.class in JettyApplication.java ,并以某种方式通过将 web.xml 的内容加载或导入到嵌入式servlet容器中来替换它们。但我忽略如果这是一个正确的战略,如果我能做到。



这是最后的 JettyApplication.class 基于Dave的回答:

  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不久的将来...)

解决方案

如果我是你,我会慢慢地尝试剥离web中的图层。 xml并将其全部删除。这样,你将只有一个配置为整个应用程序,包括所有过滤器和servlet(这是想法)。你可以做一些并行运行,同时稳定在web.xml中过滤器重复的位置,然后当在主应用程序中具有相同的功能时,您只需删除web.xml。要向主应用程序添加过滤器,只需为过滤器 FilterRegistrationBean 实例创建@Bean定义。



您可以随时通过 SpringBootServletInitializer 支持战争部署。


I'm bootifying an existing Spring Web application so the generated war file embed a Jetty web server. I want to stick to the existing configuration as much as I can in order to limit the regressions.

Here is the existing 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>

Here is my main class 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);
  }
}

I performed a few changes to my Gradle build scripts to make it work:

  • addition of the dependencies to spring-boot-starter and spring-boot-starter-jetty
  • configuration of the spring-boot plugin

The app starts fine, the controllers are loaded and I can query the server. But none of the filters defined in the web.xml are enabled.

Now I would like to remove the imports of PropertiesConfiguration.class, ApplicationConfiguration.class and SpringDispatcherServletConfiguration.class in JettyApplication.java, and somehow replace those by loading or importing the content of web.xml into the embedded servlet container. But I ignore if that is a right strategy and if I can make it. I would greatly appreciate any help.

-- SOLUTION

Here is the final JettyApplication.class based on Dave's answer:

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();
  }
}

I will replace web.xml by a ServletContainerInitializer in a near future... stay tuned ;)

解决方案

If I were you I would slowly try to peel away the layers in web.xml and remove it altogether. That way you will only have one configuration for the whole application including all filters and servlets (that's the idea anyway). You can do some parallel running while you stabilize where the filters are duplicated in web.xml, and then when you have the same functionality in a main application you can just delete web.xml. To add filters to your main application just create @Bean definitions for Filter or FilterRegistrationBean instances.

You can always support a war deployment through SpringBootServletInitializer as well if needed.

这篇关于使用web.xml配置spring-boot应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆