Configuration d'une application Spring-Boot en utilisant web.xml
Je suis bootifying existant Printemps application Web afin généré le fichier war intégrer un serveur web Jetty. Je veux m'en tenir à la configuration existante autant que je le peux afin de limiter les régressions.
Ici est le 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>
Ici est ma classe principale 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);
}
}
J'ai effectué quelques modifications à mon Gradle créer des scripts pour le faire fonctionner:
- ajout des dépendances pour le printemps-amorçage-starter et printemps-amorçage-starter-jetée
- de configuration de spring-boot plugin
L'application démarre bien, les contrôleurs sont chargés et je peux interroger le serveur. Mais aucun des filtres définis dans la web.xml sont activés.
Maintenant je voudrais enlever les importations de PropertiesConfiguration.class
ApplicationConfiguration.class
et SpringDispatcherServletConfiguration.class
dans JettyApplication.java
et en quelque sorte remplacer ceux de chargement ou d'importer le contenu de web.xml
incorporé dans le conteneur de servlet. Mais j'ignore si c'est une bonne stratégie, et si je peux le faire. J'apprécierais toute aide.
-- SOLUTION
Ici est la dernière JettyApplication.class
basé sur Dave réponse:
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();
}
}
Je vais remplacer web.xml par un ServletContainerInitializer dans un proche avenir... restez à l'écoute 😉
source d'informationauteur Florent Bécart
Vous devez vous connecter pour publier un commentaire.
Si j'étais vous, je voudrais essayer tranquillement à décoller les couches de web.xml et retirez-le complètement. De cette façon, vous ne disposez que d'une configuration pour l'ensemble de l'application, y compris tous les filtres et les servlets (c'est l'idée de toute façon). Vous pouvez faire un peu de course parallèle tout en vous stabiliser où les filtres sont dupliqués dans le web.xml et puis, quand vous avez les mêmes fonctionnalités dans une application principale, vous pouvez simplement supprimer web.xml. Pour ajouter des filtres à vos principal de l'application, il suffit de créer @Bean définitions pour
Filter
ouFilterRegistrationBean
instances.Vous pouvez toujours soutenir une guerre de déploiement à travers
SpringBootServletInitializer
ainsi si nécessaire.