Configurando um aplicativo Primavera-boot usando web.xml

votos
16

Estou bootifying uma aplicação Spring Web existente para o arquivo war gerado incorporar um servidor web Jetty. Eu quero ficar com a configuração existente, tanto quanto eu puder, a fim de limitar as regressões.

Aqui está o existente 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>

Aqui é a minha classe 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);
  }
}

I realizadas algumas alterações no meu Gradle construir scripts para fazê-lo funcionar:

  • Além das dependências para primavera-boot-starter e primavera-boot-starter-cais
  • configuração do plugin spring-boot

O aplicativo começa bem, os controladores são carregados e posso consultar o servidor. Mas nenhum dos filtros definidos no web.xml estão habilitados.

Agora eu gostaria de remover as importações de PropertiesConfiguration.class, ApplicationConfiguration.classe SpringDispatcherServletConfiguration.classna JettyApplication.java, e de alguma forma substituir os de carga ou importar o conteúdo web.xmlpara o recipiente servlet embutido. Mas eu ignoro se isso é uma estratégia correta e se eu posso fazer isso. Eu apreciaria muito qualquer ajuda.

- SOLUÇÃO

Aqui é a final JettyApplication.classcom base na resposta 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();
  }
}

Eu substituirei web.xml por um ServletContainerInitializer em um futuro próximo ... fique atento;)

Publicado 27/09/2013 em 15:33
fonte usuário
Em outras línguas...                            


1 respostas

votos
8

Se eu fosse você eu iria lentamente tentar descascar as camadas no web.xml e removê-lo por completo. Dessa forma, você terá apenas uma configuração para o aplicativo inteiro, incluindo todos os filtros e servlets (essa é a idéia de qualquer maneira). Você pode fazer alguma paralela enquanto você estabilizar onde os filtros são duplicados em web.xml, em seguida, quando você tem a mesma funcionalidade em um aplicativo principal, você pode simplesmente apagar web.xml. Para adicionar filtros para sua aplicação principal apenas criar definições @Bean para Filterou FilterRegistrationBeaninstâncias.

Você sempre pode suportar uma implementação guerra através SpringBootServletInitializerbem, se necessário.

Respondeu 27/09/2013 em 16:11
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more