Как передать локальное имя файла в ClassPathXmlApplicationContext?

Под «локальным именем файла» я подразумеваю, что файл ресурсов находится в том же каталоге, что и файл класса. В случае ниже это JUnitRunner.class файл. getResource()< Java /a> файл может справиться с этим, если путь не начинается с /'

Не могу понять, как сделать тот самый конструктор 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  - File exists: true
15:32:27,422 50   [main] INFO  org.springframework.context.support.ClassPathXmlApplicationContext  - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@ee3aa7: startup date [Thu Nov 01 15:32:27 MSK 2012]; root of context hierarchy
15:32:27,475 103  [main] INFO  org.springframework.beans.factory.xml.XmlBeanDefinitionReader  - Loading XML bean definitions from class path resource [test01.xml]
15:32:27,477 105  [main] ERROR springtests.JUnitRunner  - Can't load context
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [test01.xml]; nested exception is java.io.FileNotFoundException: class path resource [test01.xml] cannot be opened because it does not exist
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:341)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)

...

ОБНОВЛЕНИЕ

XML-файл находится в той же папке, что и файл класса. Это видно из того, что его видят getResource().


person Dims    schedule 01.11.2012    source источник
comment
где вы разместили test01.xml? Если вы используете maven, можете ли вы поместить его, например, в папку test/resources/test01.xml и повторить тест?   -  person user1516873    schedule 01.11.2012


Ответы (4)


поэтому ваш xml-файл в пакете springtests и правильное создание AppContext должны быть

new ClassPathXmlApplicationContext("springtests/test01.xml");
person user1516873    schedule 01.11.2012
comment
это абсолютный путь от корня; можно ли использовать относительный путь из местоположения класса? - person Dims; 01.11.2012
comment
в этом случае вы можете использовать FileSystemXmlApplicationContext(). - person user1516873; 01.11.2012
comment
Как? Через API ресурсов Java? не красивая - person Dims; 01.11.2012
comment
static.springsource. org/spring/docs/3.0.x/javadoc-api/org/ вы можете указать путь относительно рабочего каталога виртуальной машины или абсолютный путь. - person user1516873; 01.11.2012

Я не совсем понимаю, о чем вы спрашиваете, но вы пробовали:

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

Это будет искать во всем пути к классам test01.xml. Вы можете узнать больше об этом на странице документации Spring ресурсы.

person Augusto    schedule 01.11.2012
comment
Я хочу использовать конкретное место - то же, что и файл класса. - person Dims; 01.11.2012
comment
@Augusto для ClassPath XMLApplicationContext set classpath* часть не является обязательной - person user1516873; 01.11.2012

Возможно, потребуется настроить DocumentBuilderFactory. Справочник

Пример :

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

Контекст приложения можно загрузить из местоположения относительно текущего класса.

Это все, что вам нужно сделать, чтобы это произошло:

URL resourceUrl = JUnitRunner.class.getResource("test01.xml");
ApplicationContext applicationContext = new GenericXmlApplicationContext(
    new UrlResource(resourceUrl));
person stefaan dutry    schedule 10.09.2013