【问题标题】:Spring Boot: Web.xml and embedded server jarSpring Boot:Web.xml 和嵌入式服务器 jar
【发布时间】:2015-06-27 07:27:51
【问题描述】:

我正在尝试将旧版 spring-mvc 应用程序转换为 Spring boot(以便拥有一个自包含的 JAR 以便更轻松地升级到 Java-8)。

我认为没有理由使用代码替换我现有的 web.xml 文件,因为代码看起来像配置并且 web.xml 更加成熟。

是否可以在 Spring Boot 应用程序(嵌入式 JAR 模式)中使用我现有的 web.xml?

编辑:我也想避免使用@EnableAutoConfiguration

谢谢

【问题讨论】:

  • 所以你想要spring-boot但又不想使用它......那何必呢,只需用嵌入式tomcat创建你自己的可执行文件就可以了。而不是尝试使用一个框架,然后尝试围绕同一个框架工作。

标签: spring-boot


【解决方案1】:

好的,多亏了 Mecon,我离我更近了一点。我不得不删除 web.xml 中的 ContextLoaderListener;即使在 contextConfigLocation 中引用了 xml Spring 配置,也必须导入它。

@Configuration
@ComponentScan
@EnableAutoConfiguration
@ImportResource(value = {"classpath:/webapp-base.xml"})
public class WebApp {

    @Autowired
    private ServerProperties serverProperties;

    @Autowired
    private MediaConfiguration mediaConfig;

        @Bean
        public EmbeddedServletContainerFactory servletContainer() {
            JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory();
            factory.setContextPath(serverProperties.getContextPath());
            factory.addConfigurations(new WebXmlConfiguration());
            factory.addServerCustomizers(server -> {
                    List<Handler> resourceHandlers = getResourceHandlers();
                    Handler original = server.getHandler();

                    HandlerList handlerList = new HandlerList();
                    Handler[] array = getHandlers(original, resourceHandlers);
                    handlerList.setHandlers(array);

                    server.setHandler(handlerList);
                }
            );
            return factory;
        }

    private List<Handler> getResourceHandlers() {
        return mediaConfig.getMappings().stream().map(m -> {
            ContextHandler contextHandler = new ContextHandler(m.getUrlpath());
            ResourceHandler resourceHandler = new ResourceHandler();
            resourceHandler.setResourceBase(m.getFilepath());
            contextHandler.setHandler(resourceHandler);
            return contextHandler;
        }).collect(Collectors.toList());
    }

    private Handler[] getHandlers(Handler original, List<Handler> resourceHandlers) {
        ArrayList<Handler> handlers = new ArrayList<>();
        handlers.add(original);
        handlers.addAll(resourceHandlers);
        return handlers.toArray(new Handler[resourceHandlers.size()+1]);
    }

    public static void main(String[] args) {
        SpringApplication.run(WebApp.class, args);
    }

}

【讨论】:

    【解决方案2】:

    你不需要 Spring-Boot 来拥有一个独立的 JAR,你真正需要的是嵌入式 Tomcat 或 Jetty。

    public static void main(String[] a)创建一个类,这个类将在Jar被java -jar myWebapp.jar命令“执行”时使用。

    main 方法中,您可以启动 Embedded Tomcat 或 Jetty,并通过引用现有的 web.xml 使其加载您的 webapp。

    【讨论】:

    • 谢谢,但仍不清楚。如何引用现有的 web.xml?
    猜你喜欢
    • 1970-01-01
    • 2011-03-02
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 2015-09-30
    • 2021-05-18
    相关资源
    最近更新 更多