gpt4 book ai didi

configuration - 使用 web.xml 配置 spring-boot 应用程序

转载 作者:行者123 更新时间:2023-12-03 14:19:53 25 4
gpt4 key购买 nike

我正在启动一个现有的 Spring Web 应用程序,以便生成的 war 文件嵌入一个 Jetty Web 服务器。我想尽可能地坚持现有的配置,以限制回归。

这是现有的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>

这是我的主要类(class) 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-starter 和 spring-boot-starter-jetty
  • spring-boot 插件的配置

  • 该应用程序启动正常, Controller 已加载,我可以查询服务器。但是 web.xml 中定义的过滤器都没有启用。

    现在我想删除 PropertiesConfiguration.class 的导入, ApplicationConfiguration.classSpringDispatcherServletConfiguration.classJettyApplication.java , 并通过加载或导入 web.xml 的内容以某种方式替换它们到嵌入式 servlet 容器中。但我忽略了这是否是一个正确的策略,如果我能做到。我将不胜感激任何帮助。

    - 解决方案

    这是最终的 JettyApplication.class根据戴夫的回答:
    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();
    }
    }

    我将在不久的将来用 ServletContainerInitializer 替换 web.xml ......敬请期待;)

    最佳答案

    如果我是你,我会慢慢尝试剥离 web.xml 中的层并将其完全删除。这样,您将只有一个配置用于整个应用程序,包括所有过滤器和 servlet(无论如何都是这个想法)。您可以在稳定过滤器在 web.xml 中重复的位置时进行一些并行运行,然后当您在主应用程序中具有相同的功能时,您可以删除 web.xml。要向主应用程序添加过滤器,只需为 Filter 创建@Bean 定义。或 FilterRegistrationBean实例。

    您可以随时通过SpringBootServletInitializer 支持 war 部署。以及如果需要。

    关于configuration - 使用 web.xml 配置 spring-boot 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19053388/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com