Как да предам локално име на файл към 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/ можете да зададете път спрямо работната директория на VM или абсолютен път. - 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