programing

web.xml을 사용하여 스프링 부트 응용 프로그램 구성

yellowcard 2023. 7. 4. 21:49
반응형

web.xml을 사용하여 스프링 부트 응용 프로그램 구성

생성된 war 파일에 Jetty 웹 서버가 포함되도록 기존 Spring 웹 응용 프로그램을 부팅하는 중입니다.회귀를 제한하기 위해 가능한 한 기존의 구성을 고수하고 싶습니다.

여기에 기존 제품이 있습니다.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>

여기가 나의 주요 수업입니다.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);
  }
}

작동하기 위해 Gradle 빌드 스크립트를 몇 가지 변경했습니다.

  • spring-boot-boot-boot-boot-boot-boot-jetty에 대한 종속성 추가
  • 스프링 부트 플러그인 구성

앱이 정상적으로 시작되고 컨트롤러가 로드되고 서버에 쿼리할 수 있습니다.그러나 web.xml에 정의된 필터를 사용할 수 없습니다.

이제 다음의 수입품을 제거하고 싶습니다.PropertiesConfiguration.class,ApplicationConfiguration.class그리고.SpringDispatcherServletConfiguration.classJettyApplication.java그리고 어떻게든 내용을 로드하거나 가져오는 것으로 그것들을 대체합니다.web.xml내장된 서블릿 컨테이너로 이동합니다.하지만 저는 그것이 옳은 전략인지, 그리고 제가 해낼 수 있는지는 무시합니다.도움을 주시면 대단히 감사하겠습니다.

솔루션

결승전입니다.JettyApplication.classDave의 답변을 기반으로 합니다.

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

web.xml을 서블릿 컨테이너로 바꿉니다.가까운 미래의 이니셜라이저...채널 고정 ;)

내가 당신이라면 web.xml의 레이어를 천천히 벗겨내고 완전히 제거하려고 할 것입니다.이렇게 하면 모든 필터와 서블릿을 포함한 전체 응용프로그램에 대한 하나의 구성만 가질 수 있습니다.web.xml에서 필터가 중복되는 위치를 안정화하는 동안 병렬 실행을 수행할 수 있으며, 기본 응용 프로그램에서 동일한 기능을 사용하는 경우 web.xml을 삭제할 수 있습니다.기본 응용 프로그램에 필터를 추가하려면 다음에 대한 @Bean 정의를 만듭니다.Filter또는FilterRegistrationBean예를 들면

다음을 통해 언제든지 전쟁 배치를 지원할 수 있습니다.SpringBootServletInitializer필요한 경우에도 마찬가지입니다.

언급URL : https://stackoverflow.com/questions/19053388/configuring-a-spring-boot-application-using-web-xml

반응형