SpringBoot WEB-INF 未加载

问题描述 投票:0回答:2

我有一个 Spring Boot 应用程序。打包为war文件,内容如下

static
org - springframework - boot -loader - SpringClasses
META-INF
    - MANIFEST.MF
    - maven -my.group.id - my-artifact-id - pom.xml & pom.properties
WEB-INF
    - lib (contains all jars)
    - classes (my main application's classes)
    - some other stuff
    - web.xml
    - main-servlet.xml

其中 web.xml 和 main-servlet.xml 是配置 xml

我尝试从 springBoot 应用程序执行以下操作:

@EnableWebMvc
@EnableAutoConfiguration
@Configuration
@ImportResource({ "classpath:main-servlet.xml"})
public class FakeAppBooter {

    public static void main(String args[]) {
        SpringApplication.run(FakeAppBooter.class, args);
        System.out.println("Test");
    }

    public DispatcherServlet mvcDispatcherServlet() {
            XmlWebApplicationContext ctx = new XmlWebApplicationContext();
            ctx.setConfigLocation("classpath:main-servlet.xml");
            DispatcherServlet dispatcherServlet = new DispatcherServlet(ctx);
            return dispatcherServlet;
        }

        @Bean
        public ServletRegistrationBean mvcServletRegistrationBean() {
            ServletRegistrationBean bean = new ServletRegistrationBean();
            bean.setServlet(mvcDispatcherServlet());
            ArrayList<String> list = new ArrayList<>();
            list.add("/");
            bean.setUrlMappings(list);
            return bean;
        }
}

但是在启动时我得到:

Caused by: java.io.FileNotFoundException: class path resource [main-servlet.xml] cannot be opened because it does not exist
        at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:172)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:329)
        ... 25 more

我需要这些来为我的应用程序定义 servlet。

我该怎么办?

java xml spring servlets spring-boot
2个回答
0
投票

您问题的解决方案:

  1. 当你使用SpringBoot时,永远不要关心你的web.xml,因为SpringBoot本身会通过EmbeddedServletContainer(最好是TomcatEmbeddedServletContainer)初始化你的web容器。因此,忽略您的 web.xml 配置,它解决了您的第一个问题
  2. 您尚未将 main-servlet.xml 放置在正确的类路径中。复制 main-servlet.xml 并将其粘贴到项目的 src 文件夹中。

  3. 相应地更改您的代码

    import java.util.ArrayList;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    //Place your Imports Appropriately
    
    /**
     * @author Praveen
     *
     */
      @EnableWebMvc
      @EnableAutoConfiguration(exclude=DataSourceAutoConfiguration.class)
      @ImportResource({ "classpath:main-servlet.xml"})
      @ComponentScan
      public class FakeAppBooter {
      private ApplicationContext ctx;
      public static void main(String[] args) {
      SpringApplication.run(FakeAppBooter.class, args);
      System.out.println("Test>>>>");
     }
      public DispatcherServlet mvcDispatcherServlet() {
         ctx = new ClassPathXmlApplicationContext();
         ((AbstractRefreshableConfigApplicationContext)                       ctx).setConfigLocation("classpath:main-servlet.xml");
         DispatcherServlet dispatcherServlet = new DispatcherServlet();
          return dispatcherServlet;
       }
    
      @Bean
        public ServletRegistrationBean mvcServletRegistrationBean() {
        ServletRegistrationBean bean = new ServletRegistrationBean();
        bean.setServlet(mvcDispatcherServlet());
        ArrayList<String> list = new ArrayList<>();
        list.add("/");
        bean.setUrlMappings(list); 
        return bean;
        }
      }
    
  4. 主servlet.xml
    我以非常简单的方式保留了 main-servlet.xml。

    main-servlet.xml 文件

  5. 成功登录如下
    成功登录


0
投票

对于任何有类似问题的人。我找到了为什么在使用像tomcat这样的嵌入式服务器时,Spring Boot在启动时无法加载带有bean定义的xml文件的答案。原因是,对于类路径之外的文件,Spring 需要使用尚不存在的 ServletContext...当创建应用程序上下文时,嵌入式 tomcat 将在应用程序上下文中初始化 ServletContext,从此时起,您可以自由地从 WEB-INF 读取任何文件甚至在类路径之外。

参见

ServletWebServerApplicationContext.selfInitialize

© www.soinside.com 2019 - 2024. All rights reserved.