Die Konfiguration einer spring-boot-Anwendung mit web.xml
Ich bin bootifying einer vorhandenen Spring-Web-Anwendung, so dass die generierte war-Datei einbetten einer Jetty web-server. Ich halten wollen, um die vorhandene Konfiguration so viel wie ich kann, um zu beschränken und die Regressionen.
Hier ist die vorhandene 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>
Hier ist meine main Klasse 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);
}
}
Trat ich ein paar änderungen an meinem Gradle-build-Skripte, damit es funktioniert:
- zusätzlich die Abhängigkeiten zu spring-boot-starter-und spring-boot-starter-Steg
- Konfiguration des spring-boot-plugin
Die app startet gut, die Controller sind geladen und ich kann den server Abfragen. Aber keiner der Filter definiert, in der web.xml aktiviert sind.
Nun würde ich gerne entfernen, die Einfuhren von PropertiesConfiguration.class
ApplicationConfiguration.class
und SpringDispatcherServletConfiguration.class
im JettyApplication.java
und irgendwie ersetzen Sie diese durch laden oder importieren von Inhalt von web.xml
in die eingebettete servlet-container. Aber ich ignorieren, wenn das ist eine richtige Strategie, und wenn ich es machen kann. Ich würde mich sehr über jede Hilfe.
-- LÖSUNG
Hier ist der Letzte JettyApplication.class
basierend auf Dave ' s Antwort:
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();
}
}
Werde ich ersetzen web.xml durch eine ServletContainerInitializer in Naher Zukunft... stay tuned 😉
InformationsquelleAutor der Frage Florent Bécart | 2013-09-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich du wäre würde ich langsam versuchen, Sie zu schälen die Schichten in web.xml und entfernen es insgesamt. So haben Sie nur eine Konfiguration für die gesamte Anwendung inklusive aller Filter und servlets (das ist die Idee sowieso). Sie können tun, einige parallel laufen, während Sie stabilisieren, wo die Filter sind doppelt web.xml und dann, wenn Sie die gleiche Funktionalität haben eine Haupt-Anwendung können Sie einfach löschen web.xml. Zu Filter hinzufügen zu Ihrem Haupt-Anwendung erstellen Sie einfach @Bean-Definitionen für
Filter
oderFilterRegistrationBean
Instanzen.Können Sie immer die Unterstützung eines Krieges-Bereitstellung durch
SpringBootServletInitializer
als auch, wenn nötig.InformationsquelleAutor der Antwort Dave Syer