configuration servlet-filters web.xml embedded-jetty spring-boot

configuration - Configurando una aplicación de arranque por resorte usando web.xml



servlet-filters embedded-jetty (1)

Si fuera tú, lentamente intentaría quitar las capas en web.xml y eliminarlas por completo. De esa manera, solo tendrá una configuración para toda la aplicación, incluidos todos los filtros y servlets (de todos modos esa es la idea). Puede realizar una ejecución paralela mientras se estabiliza donde se duplican los filtros en web.xml, y luego, cuando tenga la misma funcionalidad en una aplicación principal, simplemente puede eliminar web.xml. Para agregar filtros a su aplicación principal, simplemente cree las definiciones de @Bean para instancias de Filter o FilterRegistrationBean .

Siempre puede apoyar una implementación de guerra a través de SpringBootServletInitializer también si es necesario.

Estoy iniciando una aplicación Spring Web existente para que el archivo war generado incruste un servidor web Jetty. Quiero mantener la configuración existente tanto como pueda para limitar las regresiones.

Aquí está el web.xml existente:

<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>

Aquí está mi clase principal 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); } }

Realicé algunos cambios en mis scripts de compilación de Gradle para que funcionen:

  • adición de las dependencias a spring-boot-starter y spring-boot-starter-jetty
  • configuración del plugin spring-boot

La aplicación comienza bien, los controladores están cargados y puedo consultar el servidor. Pero ninguno de los filtros definidos en el web.xml está habilitado.

Ahora me gustaría eliminar las importaciones de PropertiesConfiguration.class , ApplicationConfiguration.class y SpringDispatcherServletConfiguration.class en JettyApplication.java , y de alguna manera reemplazarlas cargando o importando el contenido de web.xml en el contenedor de servlet incrustado. Pero ignoro si esa es una estrategia correcta y si puedo lograrla. Apreciaría mucho cualquier ayuda.

- SOLUCION

Aquí está el último JettyApplication.class basado en la respuesta de 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(); } }

Reemplazaré web.xml por un ServletContainerInitializer en un futuro próximo ... estad atentos;)