IOException从类路径资源解析XML文档 - 文件不存在 - Spring

时间:2014-08-12 12:12:40

标签: java xml spring maven junit4

我知道有关spring xml配置文件的问题在执行中未被发现过几次,但是其他答案似乎都不适用于我。

我正在尝试使用Spring和JUnit在Maven项目中运行一些测试,我总是得到这个错误:

  

T E S T S.   运行es.udc.jcastedo.NosaTenda.test.model.productoService.ProductoServiceTest   12-ago-2014 13:37:33 org.springframework.test.context.TestContextManager retrieveTestExecutionListeners   信息:无法实例化TestExecutionListener [org.springframework.test.context.web.ServletTestExecutionListener]。指定自定义侦听器类或使默认侦听器类(及其所需的依赖项)可用。违规类:[javax / servlet / ServletContext]   12-ago-2014 13:37:33 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh   信息:刷新org.springframework.context.support.ClassPathXmlApplicationContext@2f8bbc98:启动日期[Tue Aug 12 13:37:33 CEST 2014];上下文层次结构的根   12-ago-2014 13:37:33 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions   信息:从类路径资源[nosaTenda-spring-config.xml]加载XML bean定义   测试运行:2,失败:0,错误:2,跳过:0,经过的时间:0.225秒<<< FAILURE!

     

结果:

     

错误测试:   es.udc.jcastedo.NosaTenda.test.model.productoService.ProductoServiceTest   es.udc.jcastedo.NosaTenda.test.model.productoService.ProductoServiceTest:无法初始化类es.udc.jcastedo.NosaTenda.test.model.util.DbUtil

     

测试运行:2,失败:0,错误:2,跳过:0

这是指向“万无一失”报告的完整描述的链接:https://dl.dropboxusercontent.com/u/2635926/es.udc.jcastedo.NosaTenda.test.model.productoService.ProductoServiceTest.txt

你可以在哪里找到这一行:

  

引起:org.springframework.beans.factory.BeanDefinitionStoreException:IOException从类路径资源[nosaTenda-spring-config.xml]解析XML文档;嵌套异常是java.io.FileNotFoundException:无法打开类路径资源[nosaTenda-spring-config.xml],因为它不存在

     

引起:java.io.FileNotFoundException:无法打开类路径资源[nosaTenda-spring-config.xml],因为它不存在

     

es.udc.jcastedo.NosaTenda.test.model.productoService.ProductoServiceTest已用时间:0.003秒<<<错误!   java.lang.NoClassDefFoundError:无法初始化类es.udc.jcastedo.NosaTenda.test.model.util.DbUtil     at es.udc.jcastedo.NosaTenda.test.model.productoService.ProductoServiceTest.cleanDb(ProductoServiceTest.java:52)

DbUtil是所有测试调用的辅助类,其中初始化上下文:

public class DbUtil {
    static {
        ApplicationContext context = new ClassPathXmlApplicationContext("nosaTenda-spring-config.xml");
        transactionManager = (PlatformTransactionManager) context
            .getBean("transactionManager");
        productoDao = (ProductoDao) context.getBean("productoDao");
        tiendaDao = (TiendaDao) context.getBean("tiendaDao");
    }

    ...

    public static void populateDb() {
    ...
    }
    public static void cleanDb() throws Throwable {
    ...
    }
}

显然存在问题,因为看起来无论什么都找不到xml配置文件,它在ClassPathXmlApplicationContext方法调用中断开。

理论上,spring配置文件位于src / main / resources中的位置。

我尝试了所有组合,从限定名称“/NosaTenda/src/main/resources/nosaTenda-spring-config.xml”到“nosaTenda-spring-config.xml”,结果相同。

我不知道类路径有什么问题,或者问题是否在其他地方。

修改

这是项目的pom,我只记得我在build-resources部分添加了一些过滤,也许我在那里做错了,这就是问题。

https://dl.dropboxusercontent.com/u/2635926/pom.xml

2 个答案:

答案 0 :(得分:0)

通常,您的类路径为... / src / main / java /,ClassPathXmlApplicationContext将从... / src / main / resources中读取。 然后你的测试类将在... / src / test / java /和ClassPathXmlApplicationContext中读取... / src / test / resources。

因此,请检查测试应用程序上下文的位置,并在其中放置xml的副本。

答案 1 :(得分:0)

好的,我找到了解决方案,它就在其他地方。

我正在使用带有 forkMode none 参数的运行配置,因为我正在运行单个测试类。 forkMode 显然已被弃用并导致问题。我用 forkCount 0 替换它并且工作得很好,它找到了spring xml配置文件,甚至测试版覆盖了一些参数,如此完美。现在我只需调试配置中的大量其他错误:)

INFO: Loading XML bean definitions from class path resource [nosaTenda-spring-config.xml]
12-ago-2014 17:42:09 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [nosaTenda-spring-config-test.xml]
12-ago-2014 17:42:09 org.springframework.beans.factory.support.DefaultListableBeanFactory registerBeanDefinition
INFO: Overriding bean definition for bean 'dataSource': replacing [Generic bean: class [org.springframework.jndi.JndiObjectFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [nosaTenda-spring-config.xml]] with [Generic bean: class [org.springframework.jdbc.datasource.SingleConnectionDataSource]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [nosaTenda-spring-config-test.xml]]

感谢。