【问题标题】:How to pass local filename to ClassPathXmlApplicationContext?如何将本地文件名传递给 ClassPathXmlApplicationContext?
【发布时间】:2012-10-22 01:16:17
【问题描述】:

“本地文件名”是指资源文件与类文件位于同一目录中。在下面的情况下,这是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 [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()看到了。

【问题讨论】:

  • 你在哪里放置了 test01.xml?如果您使用的是 maven,您可以将它放在例如文件夹 test/resources/test01.xml 中并再次尝试您的测试吗?

标签: java spring classpath applicationcontext


【解决方案1】:

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

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

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

【讨论】:

  • 我想使用特定的地方 -- 和类文件一样。
  • @Augusto for ClassPath XMLApplicationContext set "classpath*" part is not nessesary
【解决方案2】:

可能需要配置DocumentBuilderFactoryReference

例子:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 这是绝对路径,从根目录开始;是否可以从班级位置使用相对路径?
    • 在这种情况下你可以使用 FileSystemXmlApplicationContext()。
    • 怎么样?通过 Java 资源 API?不漂亮
    • static.springsource.org/spring/docs/3.0.x/javadoc-api/org/…你可以设置相对于VM工作目录的路径或绝对路径。
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      相关资源
      最近更新 更多