4

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

我不知道,如何做同样的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 [main] 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] 错误 springtests.JUnitRunner - 无法加载上下文
org.springframework.beans.factory.BeanDefinitionStoreException: IOException 从类路径资源 [test01.xml] 解析 XML 文档;嵌套异常为 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)

...

更新

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

4

4 回答 4

15

我没有正确理解您在问什么,但是您是否尝试过:

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

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

于 2012-11-01T12:49:26.973 回答
1

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

new ClassPathXmlApplicationContext("springtests/test01.xml");
于 2012-11-01T13:03:21.760 回答
0

它可能需要配置DocumentBuilderFactory. 参考

例子 :

@BeforeClass
public static void init() {
    System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
}
于 2012-11-01T12:49:36.117 回答
0

可以从相对于当前类的位置加载应用程序上下文。

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

URL resourceUrl = JUnitRunner.class.getResource("test01.xml");
ApplicationContext applicationContext = new GenericXmlApplicationContext(
    new UrlResource(resourceUrl));
于 2013-09-10T09:27:51.730 回答