如何将本地文件名传递给ClassPathXmlApplicationContext?

“本地文件名”是指资源文件与类文件位于同一目录中。 在下面的例子中,这是JUnitRunner.class文件。 如果路径不以/ ‘开头,那么Java的getResource()文件可以处理这个问题

我无法弄清楚,如何做同样的ClassPathXmlApplicationContext构造函数?

 package springtests; import java.io.File; import java.net.URISyntaxException; import java.net.URL; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; public class JUnitRunner { private final static Logger log = LoggerFactory.getLogger(JUnitRunner.class); @Test public void test() throws URISyntaxException { String filename = "test01.xml"; URL url = getClass().getResource(filename); File file = new File(url.toURI()); log.info("File exists: {}", file.exists()); try { new ClassPathXmlApplicationContext(filename); } catch(Exception e) { log.error("Can't load context", e); } } } 

输出如下

 15:32:27,375 3 [主要] INFO springtests.JUnitRunner  - 文件存在:true
 15:32:27,422 50 [main] INFO org.springframework.context.support.ClassPathXmlApplicationContext  - 刷新org.springframework.context.support.ClassPathXmlApplicationContext@ee3aa7:启动日期[Thu Nov 01 15:32:27 MSK 2012]; 上下文层次结构的根
 15:32:27,475 103 [main] INFO org.springframework.beans.factory.xml.XmlBeanDefinitionReader  - 从类路径资源[test01.xml]加载XML bean定义
 15:32:27,477 105 [main] ERROR springtests.JUnitRunner  - 无法加载上下文
 org.springframework.beans.factory.BeanDefinitionStoreException:IOException从类路径资源[test01.xml]解析XML文档; 嵌套exception是java.io.FileNotFoundException:类路径资源[test01.xml]无法打开,因为它不存在
    在org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:341)
    在org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)

 ...

UPDATE

XML文件与类文件位于同一文件夹中。 从getResource()看到它的事实可见。

所以,你的xml文件包springtests和AppContext的正确创建应该是

 new ClassPathXmlApplicationContext("springtests/test01.xml"); 

我不明白你在问什么,但你试过了吗?

 new ClassPathXmlApplicationContext("classpath*:test01.xml"); 

这将搜索test01.xml所有类路径。 您可以在Spring 资源文档页面中阅读更多相关信息。

它可能需要配置DocumentBuilderFactory 。 参考

示例:

 @BeforeClass public static void init() { System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl"); } 

可以从相对于当前Class的位置加载applicationcontext。

这就是实现它所需要做的一切:

 URL resourceUrl = JUnitRunner.class.getResource("test01.xml"); ApplicationContext applicationContext = new GenericXmlApplicationContext( new UrlResource(resourceUrl));