我有一个 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。
我该怎么办?
您问题的解决方案:
您尚未将 main-servlet.xml 放置在正确的类路径中。复制 main-servlet.xml 并将其粘贴到项目的 src 文件夹中。
相应地更改您的代码
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;
}
}
主servlet.xml
我以非常简单的方式保留了 main-servlet.xml。
成功登录如下
成功登录
对于任何有类似问题的人。我找到了为什么在使用像tomcat这样的嵌入式服务器时,Spring Boot在启动时无法加载带有bean定义的xml文件的答案。原因是,对于类路径之外的文件,Spring 需要使用尚不存在的 ServletContext...当创建应用程序上下文时,嵌入式 tomcat 将在应用程序上下文中初始化 ServletContext,从此时起,您可以自由地从 WEB-INF 读取任何文件甚至在类路径之外。
参见
ServletWebServerApplicationContext.selfInitialize