2016-12-06 7 views
1

J'ai un projet de printemps avec une usine de gestionnaire d'entités de configuration XML, dont une partie pointe vers un fichier de mappage externe qui contient toutes mes requêtes .JPA XML Mapping fichier résout très bien, mais ne parvient pas à résoudre lors de l'exécution d'un test JUnit

Voici les versions que je utilise:

version printemps: 4.1.1.RELEASE

version JUnit: 4.9

Version printemps-données-JPA: 1.7.1.RELEASE

Version Java: 1.8

Le problème ici est que mon projet a bien fonctionné avant d'essayer d'ajouter une classe de test JUnit à mon application. En fait, le projet a commencé avec zéro erreur et j'ai pu exécuter chaque requête sans accroc. Maintenant que j'ai ajouté une classe de test, elle échoue car pendant le test unitaire, elle essaie de configurer le contexte de l'application et ne parvient pas à résoudre mon fichier de mappage. (à partir de ce que je peux déchiffrer dans la trace de la pile) Pourquoi ??

Le fichier que je suis en train de charger est queries.xml et il est situé dans src/main/resources est ici le fichier ci-dessous:

<?xml version="1.0" encoding="UTF-8"?> 
<entity-mappings xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm 
http://xmlns.jcp.org/xml/ns/persistence/orm_2_1.xsd" 
version="2.1"> 

<named-query name="GameSet.getNewTutorial"> 
    <query> 
     <![CDATA[ 
      SELECT gs 
      FROM GameSet gs 
      WHERE gs.id.gameCatCd = :qstnSet 
      AND gs.presetQstn.id.qstnSet = 'tutorials' 
      ORDER BY gs.qstnOrder ASC 
     ]]> 
    </query> 
</named-query> 

<named-query name="WkstHdr.getExistingWorksheet"> 
    <query> 
     <![CDATA[ 
      SELECT wh 
      FROM WkstHdr wh 
      WHERE wh.id.startDate BETWEEN :beginTimestamp AND :endTimestamp 
      AND wh.id.warriorId = :warriorId 
      AND wh.id.qstnSet = :qstnSet 
     ]]> 
    </query> 
</named-query> 

<named-query name="GameSet.getNewWorksheet"> 
    <query> 
     <![CDATA[ 
      SELECT gs 
      FROM GameSet gs 
      WHERE gs.presetQstn.id.qstnSet = :qstnSet 
     ]]> 
    </query> 
</named-query> 

<named-query name="WkstVal.getExistingTutorial"> 
    <query> 
     <![CDATA[ 
      SELECT v 
      FROM WkstVal v 
      WHERE v.id.warriorId = :warriorId 
      AND v.id.gameCatCd = :qstnSet 
      AND v.id.qstnSet = 'tutorials' 
      ORDER BY v.gameSet.qstnOrder 
     ]]> 
    </query> 
</named-query> 

<named-native-query name="Score.getScore" result-set-mapping="ScoreMapping"> 
    <query> 
     <![CDATA[ 
      SELECT sum(CASE WHEN v.bool_resp = true THEN pq.points ELSE 0 END)/:total AS points, 
      sum(CASE WHEN ((v.game_cat_cd = 'summary') AND (v.game_sub_cat_cd = 'zone') AND (v.num_resp > 0)) THEN v.num_resp ELSE 0 END)/
      (CASE WHEN (CASE WHEN :total = 1 THEN 1 ELSE (sum(CASE WHEN ((v.game_cat_cd = 'summary') AND (v.game_sub_cat_cd = 'zone') AND (v.num_resp > 0)) THEN 1 ELSE 0 END)) END) > 0 THEN (CASE WHEN :total = 1 THEN 1 ELSE (sum(CASE WHEN ((v.game_cat_cd = 'summary') AND (v.game_sub_cat_cd = 'zone') AND (v.num_resp > 0)) THEN 1 ELSE 0 END)) END) ELSE 1 END) AS zone, 
      sum(CASE WHEN ((v.game_cat_cd = 'summary') AND (v.game_sub_cat_cd = 'power')) THEN v.num_resp ELSE 0 END)/:total AS power 
      FROM preset_qstn pq JOIN game_set gs JOIN wkst_hdr wh JOIN wkst_val v 
      ON wh.warrior_id = v.warrior_id 
      AND wh.qstn_set = v.qstn_set 
      AND wh.start_date = v.start_date 
      ON gs.game_cat_cd = v.game_cat_cd 
      AND gs.game_sub_cat_cd = v.game_sub_cat_cd 
      AND gs.game_cd = v.game_cd 
      AND gs.qstn_cd = v.qstn_cd 
      ON pq.qstn_set = gs.qstn_set 
      AND pq.qstn_cd = gs.qstn_cd 
      WHERE wh.warrior_id = :warriorId 
      AND wh.qstn_set = :qstnSet 
      AND wh.start_date BETWEEN :beginTimestamp AND :endTimestamp 
     ]]> 
    </query> 
</named-native-query> 

<named-native-query name="Task.getTasks" result-set-mapping="TaskMapping"> 
    <query> 
     <![CDATA[ 
      SELECT "public"."wkst_hdr"."start_date" AS startDate, 
      "public"."wkst_hdr"."cmpl_date" AS cmplDate, 
      "public"."wkst_val"."bool_resp" AS important, 
      "public"."wkst_val"."txt_resp" AS description 
      FROM "public"."wkst_hdr" 
      JOIN "public"."wkst_val" 
      ON "public"."wkst_hdr"."warrior_id" = "public"."wkst_val"."warrior_id" 
      AND "public"."wkst_hdr"."start_date" = "public"."wkst_val"."start_date" 
      AND "public"."wkst_hdr"."qstn_set" = "public"."wkst_val"."qstn_set" 
      WHERE "public"."wkst_hdr"."warrior_id" = :warriorId 
      AND "public"."wkst_hdr"."qstn_set" = 'todos' 
      ORDER BY "public"."wkst_hdr"."start_date" DESC, 
      "public"."wkst_val"."bool_resp" DESC 
     ]]> 
    </query> 
</named-native-query> 

<sql-result-set-mapping name="ScoreMapping"> 
    <constructor-result target-class="com.wakeupwarrior.model.api.Score"> 
     <column name="zone" class="java.math.BigDecimal"/> 
     <column name="points" class="java.math.BigDecimal"/> 
     <column name="power" class="java.math.BigDecimal"/> 
    </constructor-result> 
</sql-result-set-mapping> 

<sql-result-set-mapping name="TaskMapping"> 
    <constructor-result target-class="com.wakeupwarrior.model.api.Task"> 
     <column name="startDate" class="java.util.Date"/> 
     <column name="cmplDate" class="java.util.Date"/> 
     <column name="description" class="java.lang.String"/> 
     <column name="important" class="java.lang.Boolean"/> 
    </constructor-result> 
</sql-result-set-mapping> 

j'ai un fichier de contexte de l'application principale et j'ai un contexte fichier pour les tests JUnit, ils sont exactement les mêmes. Voici une copie de mon dossier de contexte:

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/mvc" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:beans="http://www.springframework.org/schema/beans" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:jpa="http://www.springframework.org/schema/data/jpa" 
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx.xsd 
    http://www.springframework.org/schema/data/jpa 
    http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> 

<!-- Enables the Spring MVC @Controller programming model and pageable --> 
<annotation-driven> 
    <argument-resolvers> 
     <beans:bean id="sortResolver" class="org.springframework.data.web.SortHandlerMethodArgumentResolver" /> 
     <beans:bean id="pageableResolver" class="org.springframework.data.web.PageableHandlerMethodArgumentResolver"> 
      <beans:constructor-arg ref="sortResolver" /> 
     </beans:bean> 
    </argument-resolvers> 
</annotation-driven> 


<!-- Enables Spring to bootstrap the correct packages, looking for components --> 
<context:component-scan base-package="com.slconnected.*" /> 
<context:component-scan base-package="com.wakeupwarrior.*" /> 


    <!-- Handles HTTP GET requests for the index.html file --> 
<resources mapping="/*" location="/" /> 

<!-- Handles HTTP GET requests for /resources/** by serving static resources in the ${webappRoot}/resources directory --> 
<resources mapping="/resources/**" location="/resources/" /> 

<resources mapping="/node_modules/**" location="/node_modules/" /> 

<resources mapping="/themes/**" location="/themes/" /> 


<!-- Resolves messages on error inputs --> 
<beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <beans:property name="basename" value="classpath:messages" /> 
</beans:bean> 


<!-- Adds properties from warrior-db.properties --> 
<beans:bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <beans:property name="location" value="classpath:warrior-db.properties" /> 
</beans:bean> 

<!-- Warrior DB data source with c3p0 connection pool--> 
<beans:bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
    <!-- Connection properties --> 
    <beans:property name="driverClass" value="${jdbc.driverClass}" /> 
    <beans:property name="jdbcUrl" value="${jdbc.jdbcUrl}" /> 
    <beans:property name="user" value="${jdbc.user}" /> 
    <beans:property name="password" value="${jdbc.password}" /> 
    <!-- Pool properties --> 
    <beans:property name="minPoolSize" value="${jdbc.minPoolSize}" /> 
    <beans:property name="maxPoolSize" value="${jdbc.maxPoolSize}" /> 
    <beans:property name="acquireIncrement" value="${jdbc.acquireIncrement}" /> 
    <beans:property name="maxStatements" value="${jdbc.maxStatements}" /> 
    <beans:property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}" /> 
    <beans:property name="loginTimeout" value="${jdbc.loginTimeout}" /> 
</beans:bean> 

<!-- Entity Manager Factory --> 
<beans:bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <beans:property name="dataSource" ref="dataSource" /> 
    <beans:property name="packagesToScan" value="com.wakeupwarrior.model.warriordb" /> 
    <beans:property name="mappingResources"> 
     <beans:list> 
      <beans:value> 
       classpath:queries.xml 
      </beans:value> 
     </beans:list> 
    </beans:property> 
    <beans:property name="jpaProperties"> 
     <beans:props> 
      <beans:prop key="hibernate.current_session_context_class"> 
       org.springframework.orm.hibernate4.SpringSessionContext 
      </beans:prop> 
     </beans:props> 
    </beans:property> 
    <beans:property name="jpaVendorAdapter"> 
     <beans:bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <beans:property name="databasePlatform" value="${jdbc.databasePlatform}" /> 
      <beans:property name="showSql" value="${jdbc.showSql}" /> 
     </beans:bean> 
    </beans:property> 
</beans:bean> 

<!-- Transaction Manager --> 
<beans:bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <beans:property name="entityManagerFactory" ref="entityManagerFactory" /> 
</beans:bean> 

<!-- Enables Transactions --> 
<tx:annotation-driven proxy-target-class="true" /> 

<!-- Annotation config --> 
<context:annotation-config/> 

Si je commente cette partie:

<beans:property name="mappingResources"> <beans:list> <beans:value> classpath:queries.xml </beans:value> </beans:list> </beans:property>

Tout semble fonctionner très bien! ..autre que le fait que je ne peux pas utiliser mes requêtes maintenant, donc cela ne résout pas mon problème.

Voici la trace de la pile que je reçois quand je tente de lancer:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [com/slconnected/test/WarriorTests-context.xml]: Invocation of init method failed; nested exception is org.hibernate.boot.MappingException: Unable to resolve explicitly named mapping-file : 
       classpath:queries.xml 
      : origin(
       classpath:queries.xml 
      ) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1568) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:540) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:956) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:747) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
at org.springframework.test.context.web.AbstractGenericWebContextLoader.loadContext(AbstractGenericWebContextLoader.java:132) 
at org.springframework.test.context.web.AbstractGenericWebContextLoader.loadContext(AbstractGenericWebContextLoader.java:59) 
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:108) 
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:260) 
at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:63) 
at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:83) 
at org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:74) 
at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:169) 
at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:109) 
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:212) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:199) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:251) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:253) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:216) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:82) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:60) 
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:67) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:292) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:162) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: org.hibernate.boot.MappingException: Unable to resolve explicitly named mapping-file : 
       classpath:queries.xml 
      : origin(
       classpath:queries.xml 
      ) 
at org.hibernate.boot.model.process.internal.ScanningCoordinator.applyScanResultsToManagedResources(ScanningCoordinator.java:213) 
at org.hibernate.boot.model.process.internal.ScanningCoordinator.coordinateScan(ScanningCoordinator.java:81) 
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.prepare(MetadataBuildingProcess.java:98) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:200) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:150) 
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider$1.<init>(SpringHibernateJpaPersistenceProvider.java:49) 
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:49) 
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:341) 
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1627) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1564) 
... 40 more 
ERROR: org.springframework.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [or[email protected]31f924f5] to prepare test instance [[email protected]] 
java.lang.IllegalStateException: Failed to load ApplicationContext 
at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:91) 
at org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:74) 
at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:169) 
at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:109) 
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:212) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:199) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:251) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:253) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:216) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:82) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:60) 
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:67) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:292) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:162) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [com/slconnected/test/WarriorTests-context.xml]: Invocation of init method failed; nested exception is org.hibernate.boot.MappingException: Unable to resolve explicitly named mapping-file : 
       classpath:queries.xml 
      : origin(
       classpath:queries.xml 
      ) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1568) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:540) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:956) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:747) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
at org.springframework.test.context.web.AbstractGenericWebContextLoader.loadContext(AbstractGenericWebContextLoader.java:132) 
at org.springframework.test.context.web.AbstractGenericWebContextLoader.loadContext(AbstractGenericWebContextLoader.java:59) 
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:108) 
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:260) 
at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:63) 
at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:83) 
... 25 more 
Caused by: org.hibernate.boot.MappingException: Unable to resolve explicitly named mapping-file : 
       classpath:queries.xml 
      : origin(
       classpath:queries.xml 
      ) 
at org.hibernate.boot.model.process.internal.ScanningCoordinator.applyScanResultsToManagedResources(ScanningCoordinator.java:213) 
at org.hibernate.boot.model.process.internal.ScanningCoordinator.coordinateScan(ScanningCoordinator.java:81) 
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.prepare(MetadataBuildingProcess.java:98) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:200) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:150) 
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider$1.<init>(SpringHibernateJpaPersistenceProvider.java:49) 
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:49) 
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:341) 
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1627) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1564) 
... 40 more 

Encore une fois, tout fonctionne parfaitement lors de l'exécution du projet normalement. C'est seulement quand je l'exécute comme un cas de test, ou quand j'arrive à la partie de test de la construction que j'obtiens cette erreur. Qu'est-ce qui se passe ici? Comment puis-je le faire fonctionner avec mon fichier query.xml externe pendant les tests unitaires?

Répondre

0

JE L'AI FIGURÉ !!!!

J'ai passé plusieurs jours à étaler des milliers de lignes de code dans un débogueur jusqu'à ce que je puisse voir le problème en action. Il se trouve qu'il ya une ligne de code dans une classe en veille prolongée profonde org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl il tente de localiser le fichier sur le chemin de classe en utilisant le code suivant:

final URL url = getAggregatedClassLoader().getResource(name); 
     if (url != null) { 
      return url; 
     } 

Il y avait un total de deux problèmes. Tout d'abord, le processus suivi par la chaîne de nom de fichier lors de la tentative de résolution du fichier ne permettait pas l'effacement des sauts de ligne et des espaces copiés à partir du fichier queries.xml. Le dernier problème était que getResource() renvoie null si vous n'appliquez pas classpath: pendant la production, mais renvoie null si vous ajoutez classpath: en cours d'exécution en tant que JUnit.Je ne sais pas pourquoi cela arrive, mais c'est le cas. Donc, ma solution était de modifier mon fichier de contexte utilisé pour les tests JUnit à utiliser:

<beans:property name="mappingResources"> 
     <beans:list> 
      <beans:value>queries.xml</beans:value> 
     </beans:list> 
    </beans:property> 

au lieu de:

<beans:property name="mappingResources"> 
     <beans:list> 
      <beans:value> 
       classpath:queries.xml 
      </beans:value> 
     </beans:list> 
    </beans:property> 

Ainsi j'ai fini avec un contexte d'application de test modifié comme indiqué ci-dessous:

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/mvc" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:beans="http://www.springframework.org/schema/beans" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:jpa="http://www.springframework.org/schema/data/jpa" 
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx.xsd 
    http://www.springframework.org/schema/data/jpa 
    http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> 


<!-- Enables Spring to bootstrap the correct packages, looking for components --> 
<context:component-scan base-package="com.slconnected.*" /> 
<context:component-scan base-package="com.wakeupwarrior.*" /> 


<!-- Enables the Spring MVC @Controller programming model and pageable --> 
<annotation-driven> 
    <argument-resolvers> 
     <beans:bean id="sortResolver" class="org.springframework.data.web.SortHandlerMethodArgumentResolver" /> 
     <beans:bean id="pageableResolver" class="org.springframework.data.web.PageableHandlerMethodArgumentResolver"> 
      <beans:constructor-arg ref="sortResolver" /> 
     </beans:bean> 
    </argument-resolvers> 
</annotation-driven> 


<!-- Handles HTTP GET requests for the index.html file --> 
<resources mapping="/*" location="/" /> 

<!-- Handles HTTP GET requests for /resources/** by serving static resources in the ${webappRoot}/resources directory --> 
<resources mapping="/resources/**" location="/resources/" /> 

<resources mapping="/node_modules/**" location="/node_modules/" /> 

<resources mapping="/themes/**" location="/themes/" /> 


<!-- Resolves messages on error inputs --> 
<beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <beans:property name="basename" value="classpath:messages" /> 
</beans:bean> 


<!-- View resolver that works by registering beans with names --> 
<beans:bean id="beanNameResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"> 
    <beans:property name="order" value="1" /> 
</beans:bean> 

<!-- The Birt engine factory --> 
<beans:bean id="engine" class="com.wakeupwarrior.reports.core.BirtEngineFactory" /> 

<!-- Resolves POWER FOCUS HTML view --> 
<beans:bean name="html/powerFocus" id="html/powerFocus" class="com.wakeupwarrior.reports.core.HtmlSingleFormatBirtView"> 
    <beans:property name="birtEngine" ref="engine" /> 
    <beans:property name="dataSource" ref="dataSource" /> 
    <beans:property name="reportName" value="power_focus.rptdesign" /> 
    <beans:property name="reportsDirectory" value="reports" /> 
</beans:bean> 

<!-- Resolves TESTER HTML view --> 
<beans:bean name="html/tester" id="html/tester" class="com.wakeupwarrior.reports.core.HtmlSingleFormatBirtView"> 
    <beans:property name="birtEngine" ref="engine" /> 
    <beans:property name="dataSource" ref="dataSource" /> 
    <beans:property name="reportName" value="tester.rptdesign" /> 
    <beans:property name="reportsDirectory" value="reports" /> 
</beans:bean> 


<!-- Adds properties from warrior-db.properties --> 
<beans:bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <beans:property name="location" value="classpath:warrior-db.properties" /> 
</beans:bean> 

<!-- Warrior DB data source with c3p0 connection pool--> 
<beans:bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
    <!-- Connection properties --> 
    <beans:property name="driverClass" value="${jdbc.driverClass}" /> 
    <beans:property name="jdbcUrl" value="${jdbc.jdbcUrl}" /> 
    <beans:property name="user" value="${jdbc.user}" /> 
    <beans:property name="password" value="${jdbc.password}" /> 
    <!-- Pool properties --> 
    <beans:property name="minPoolSize" value="${jdbc.minPoolSize}" /> 
    <beans:property name="maxPoolSize" value="${jdbc.maxPoolSize}" /> 
    <beans:property name="acquireIncrement" value="${jdbc.acquireIncrement}" /> 
    <beans:property name="maxStatements" value="${jdbc.maxStatements}" /> 
    <beans:property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}" /> 
    <beans:property name="loginTimeout" value="${jdbc.loginTimeout}" /> 
</beans:bean> 

<!-- Entity Manager Factory --> 
<beans:bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <beans:property name="dataSource" ref="dataSource" /> 
    <beans:property name="packagesToScan" value="com.wakeupwarrior.model.*" /> 
    <beans:property name="mappingResources"> 
     <beans:list> 
      <beans:value>queries.xml</beans:value> 
     </beans:list> 
    </beans:property> 
    <beans:property name="jpaProperties"> 
     <beans:props> 
      <beans:prop key="hibernate.current_session_context_class"> 
       org.springframework.orm.hibernate4.SpringSessionContext 
      </beans:prop> 
     </beans:props> 
    </beans:property> 
    <beans:property name="jpaVendorAdapter"> 
     <beans:bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <beans:property name="databasePlatform" value="${jdbc.databasePlatform}" /> 
      <beans:property name="showSql" value="${jdbc.showSql}" /> 
     </beans:bean> 
    </beans:property> 
</beans:bean> 

<!-- Transaction Manager --> 
<beans:bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <beans:property name="entityManagerFactory" ref="entityManagerFactory" /> 
</beans:bean> 

<!-- Enables Transactions --> 
<tx:annotation-driven proxy-target-class="true" /> 

<!-- Annotation config --> 
<context:annotation-config/> 

Fonctionne parfaitement maintenant!