Spring - 抛出 java.lang.IllegalStateException 异常 - JUnit
Spring - Throws java.lang.IllegalStateException Exception - JUnit
我正在尝试测试一些 类。我是初学者。当我 运行 作为 JUnit 进行测试时,它会中止。
我尝试更改类路径,但没有成功。
即代码:
错误日志:
0 [main] INFO org.springframework.test.context.TestContextManager org.springframework.test.context.TestContextManager -@TestExecutionListeners is not present for class [class test.TestPersonaDAOImpl]: using defaults.
181 [main] INFO org.springframework.beans.factory.xml.XmlBeanDefinitionReader org.springframework.beans.factory.xml.XmlBeanDefinitionReader -Loading XML bean definitions from URL [file:/home/rugar/Documents/workspace-sts-3.6.2.RELEASE/struts-spring-hibernate/target/test-classes/datasource-test.xml]
378 [main] INFO org.springframework.beans.factory.xml.XmlBeanDefinitionReader org.springframework.beans.factory.xml.XmlBeanDefinitionReader -Loading XML bean definitions from URL [file:/home/rugar/Documents/workspace-sts-3.6.2.RELEASE/struts-spring-hibernate/target/classes/applicationContext.xml]
523 [main] INFO org.springframework.context.support.GenericApplicationContext org.springframework.context.support.GenericApplicationContext -Refreshing org.springframework.context.support.GenericApplicationContext@1fa4f2fd: startup date [Sun Feb 08 14:02:25 CST 2015]; root of context hierarchy
671 [main] INFO org.springframework.beans.factory.support.DefaultListableBeanFactory org.springframework.beans.factory.support.DefaultListableBeanFactory -Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@30f7f56b: defining beans [dataSource,sessionFactory,transactionManager,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; root of factory hierarchy
775 [main] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory -Creating embedded database 'dataSource'
907 [main] INFO org.springframework.jdbc.datasource.init.ResourceDatabasePopulator org.springframework.jdbc.datasource.init.ResourceDatabasePopulator -Executing SQL script from class path resource [esquema.sql]
919 [main] INFO org.springframework.jdbc.datasource.init.ResourceDatabasePopulator org.springframework.jdbc.datasource.init.ResourceDatabasePopulator -Done executing SQL script from class path resource [esquema.sql] in 12 ms.
919 [main] INFO org.springframework.jdbc.datasource.init.ResourceDatabasePopulator org.springframework.jdbc.datasource.init.ResourceDatabasePopulator -Executing SQL script from class path resource [datos.sql]
921 [main] INFO org.springframework.jdbc.datasource.init.ResourceDatabasePopulator org.springframework.jdbc.datasource.init.ResourceDatabasePopulator -Done executing SQL script from class path resource [datos.sql] in 2 ms.
1110 [main] INFO org.hibernate.annotations.common.Version org.hibernate.annotations.common.Version -HCANN000001: Hibernate Commons Annotations {4.0.1.Final}
1122 [main] INFO org.hibernate.Version org.hibernate.Version -HHH000412: Hibernate Core {4.1.2}
1125 [main] INFO org.hibernate.cfg.Environment org.hibernate.cfg.Environment -HHH000206: hibernate.properties not found
1127 [main] INFO org.hibernate.cfg.Environment org.hibernate.cfg.Environment -HHH000021: Bytecode provider name : javassist
1366 [main] INFO org.hibernate.dialect.Dialect org.hibernate.dialect.Dialect -HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
1376 [main] WARN org.hibernate.dialect.H2Dialect org.hibernate.dialect.H2Dialect -HHH000393: The 1.0.44 version of H2 implements temporary table creation such that it commits current transaction; multi-table, bulk hql/jpaql will not work properly
1380 [main] INFO org.hibernate.engine.jdbc.internal.LobCreatorBuilder org.hibernate.engine.jdbc.internal.LobCreatorBuilder -HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
1388 [main] INFO org.hibernate.engine.transaction.internal.TransactionFactoryInitiator org.hibernate.engine.transaction.internal.TransactionFactoryInitiator -HHH000399: Using default transaction strategy (direct JDBC transactions)
1392 [main] INFO org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory -HHH000397: Using ASTQueryTranslatorFactory
1614 [main] INFO org.springframework.beans.factory.support.DefaultListableBeanFactory org.springframework.beans.factory.support.DefaultListableBeanFactory -Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@30f7f56b: defining beans [dataSource,sessionFactory,transactionManager,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; root of factory hierarchy
1623 [main] ERROR org.springframework.test.context.TestContextManager org.springframework.test.context.TestContextManager -Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@4099d33d] to prepare test instance [test.TestPersonaDAOImpl@32fb6aed]
java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:157)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:321)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runReflectiveCall(SpringJUnit4ClassRunner.java:288)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:290)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access[=12=]0(ParentRunner.java:50)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:222)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
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 'transactionManager' defined in URL [file:/home/rugar/Documents/workspace-sts-3.6.2.RELEASE/struts-spring-hibernate/target/test-classes/datasource-test.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'org.hibernate.internal.SessionFactoryImpl' to required type 'javax.sql.DataSource' for property 'dataSource'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [org.hibernate.internal.SessionFactoryImpl] to required type [javax.sql.DataSource] for property 'dataSource': no matching editors or conversion strategy found
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:103)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:1)
at org.springframework.test.context.support.DelegatingSmartContextLoader.loadContext(DelegatingSmartContextLoader.java:228)
at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:124)
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:148)
... 24 more
Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'org.hibernate.internal.SessionFactoryImpl' to required type 'javax.sql.DataSource' for property 'dataSource'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [org.hibernate.internal.SessionFactoryImpl] to required type [javax.sql.DataSource] for property 'dataSource': no matching editors or conversion strategy found
at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:485)
at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:516)
at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:510)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1406)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1365)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
... 37 more
Caused by: java.lang.IllegalStateException: Cannot convert value of type [org.hibernate.internal.SessionFactoryImpl] to required type [javax.sql.DataSource] for property 'dataSource': no matching editors or conversion strategy found
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:241)
at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:470)
... 43 more
测试Class:
package test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import java.util.List;
import mx.com.gm.capadatos.PersonaDAO;
import mx.com.gm.capadatos.domain.Persona;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:datasource-test.xml", "classpath*:applicationContext.xml"})
public class TestPersonaDAOImpl {
private static Log logger = LogFactory.getLog("TestPersonaDAOImpl");
@Autowired
private PersonaDAO personaDao;
@Test
@Transactional
public void deberiaMostrarPersonas(){
try{
System.out.println();
logger.info("Inicio del Test deberiaMostrarPersonas");
List<Persona> personas = personaDao.findAllPersonas();
int contadorPersonas = 0;
for(Persona persona: personas){
logger.info("Persona: " + persona);
contadorPersonas++;
}
// Debería de haber la misma cantidad de personas
assertEquals(contadorPersonas, personaDao.contadorPersonas());
logger.info("Fin del test deberiaMostrarPersonas");
}
catch(Exception e)
{
logger.error("Error JBDC", e);
}
}
}
这是 ApplicationContext:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="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-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
<tx:annotation-driven/>
<context:component-scan base-package="mx.com.gm.capaservicio" />
<context:component-scan base-package="mx.com.gm.capadatos" />
</beans>
这是测试的应用程序上下文:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd">
<jdbc:embedded-database id="dataSource" type="H2">
<jdbc:script location="classpath:esquema.sql"/>
<jdbc:script location="classpath:datos.sql"/>
</jdbc:embedded-database>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
p:dataSource-ref="dataSource">
<property name="packagesToScan">
<list>
<value>mx.com.gm.capadatos.domain</value>
</list>
</property>
<property name="hibernateProperties">
<value>hibernate.format_sql=true hibernate.show_sql=true
hibernate.dialect=org.hibernate.dialect.H2Dialect</value>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager"
p:dataSource-ref="sessionFactory" />
</beans>
工具Class
package mx.com.gm.capadatos;
import java.util.List;
import mx.com.gm.capadatos.domain.Persona;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
public class PersonaDAOImpl implements PersonaDAO{
private SessionFactory sessionFactory;
@Autowired
public PersonaDAOImpl(SessionFactory sessionFactory){
this.sessionFactory = sessionFactory;
}
private Session currentSession(){
return sessionFactory.getCurrentSession();
}
public void insertPersona(Persona persona) {
currentSession().saveOrUpdate(persona);
}
public void updatePersona(Persona persona) {
currentSession().update(persona);
}
public void deletePersona(Persona persona) {
currentSession().delete(persona);
}
public Persona findPersonaById(long idPersona) {
return (Persona) currentSession().get(Persona.class, idPersona);
}
@SuppressWarnings("unchecked")
public List<Persona> findAllPersonas() {
return currentSession().createQuery("from Persona").list();
}
public long contadorPersonas() {
Long contador = (Long) currentSession().createCriteria(Persona.class)
.setProjection(Projections.rowCount()).uniqueResult();
return contador.longValue();
}
public Persona getPersonaByEmail(Persona persona) {
Example persoEjemplo = Example.create(persona);
return (Persona) currentSession().createCriteria(Persona.class)
.add(persoEjemplo).uniqueResult();
}
}
您可以使用:
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
如果您想创建 HibernateTransactionManager
和 sessionFactory
我正在尝试测试一些 类。我是初学者。当我 运行 作为 JUnit 进行测试时,它会中止。
我尝试更改类路径,但没有成功。
即代码:
错误日志:
0 [main] INFO org.springframework.test.context.TestContextManager org.springframework.test.context.TestContextManager -@TestExecutionListeners is not present for class [class test.TestPersonaDAOImpl]: using defaults.
181 [main] INFO org.springframework.beans.factory.xml.XmlBeanDefinitionReader org.springframework.beans.factory.xml.XmlBeanDefinitionReader -Loading XML bean definitions from URL [file:/home/rugar/Documents/workspace-sts-3.6.2.RELEASE/struts-spring-hibernate/target/test-classes/datasource-test.xml]
378 [main] INFO org.springframework.beans.factory.xml.XmlBeanDefinitionReader org.springframework.beans.factory.xml.XmlBeanDefinitionReader -Loading XML bean definitions from URL [file:/home/rugar/Documents/workspace-sts-3.6.2.RELEASE/struts-spring-hibernate/target/classes/applicationContext.xml]
523 [main] INFO org.springframework.context.support.GenericApplicationContext org.springframework.context.support.GenericApplicationContext -Refreshing org.springframework.context.support.GenericApplicationContext@1fa4f2fd: startup date [Sun Feb 08 14:02:25 CST 2015]; root of context hierarchy
671 [main] INFO org.springframework.beans.factory.support.DefaultListableBeanFactory org.springframework.beans.factory.support.DefaultListableBeanFactory -Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@30f7f56b: defining beans [dataSource,sessionFactory,transactionManager,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; root of factory hierarchy
775 [main] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory -Creating embedded database 'dataSource'
907 [main] INFO org.springframework.jdbc.datasource.init.ResourceDatabasePopulator org.springframework.jdbc.datasource.init.ResourceDatabasePopulator -Executing SQL script from class path resource [esquema.sql]
919 [main] INFO org.springframework.jdbc.datasource.init.ResourceDatabasePopulator org.springframework.jdbc.datasource.init.ResourceDatabasePopulator -Done executing SQL script from class path resource [esquema.sql] in 12 ms.
919 [main] INFO org.springframework.jdbc.datasource.init.ResourceDatabasePopulator org.springframework.jdbc.datasource.init.ResourceDatabasePopulator -Executing SQL script from class path resource [datos.sql]
921 [main] INFO org.springframework.jdbc.datasource.init.ResourceDatabasePopulator org.springframework.jdbc.datasource.init.ResourceDatabasePopulator -Done executing SQL script from class path resource [datos.sql] in 2 ms.
1110 [main] INFO org.hibernate.annotations.common.Version org.hibernate.annotations.common.Version -HCANN000001: Hibernate Commons Annotations {4.0.1.Final}
1122 [main] INFO org.hibernate.Version org.hibernate.Version -HHH000412: Hibernate Core {4.1.2}
1125 [main] INFO org.hibernate.cfg.Environment org.hibernate.cfg.Environment -HHH000206: hibernate.properties not found
1127 [main] INFO org.hibernate.cfg.Environment org.hibernate.cfg.Environment -HHH000021: Bytecode provider name : javassist
1366 [main] INFO org.hibernate.dialect.Dialect org.hibernate.dialect.Dialect -HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
1376 [main] WARN org.hibernate.dialect.H2Dialect org.hibernate.dialect.H2Dialect -HHH000393: The 1.0.44 version of H2 implements temporary table creation such that it commits current transaction; multi-table, bulk hql/jpaql will not work properly
1380 [main] INFO org.hibernate.engine.jdbc.internal.LobCreatorBuilder org.hibernate.engine.jdbc.internal.LobCreatorBuilder -HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
1388 [main] INFO org.hibernate.engine.transaction.internal.TransactionFactoryInitiator org.hibernate.engine.transaction.internal.TransactionFactoryInitiator -HHH000399: Using default transaction strategy (direct JDBC transactions)
1392 [main] INFO org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory -HHH000397: Using ASTQueryTranslatorFactory
1614 [main] INFO org.springframework.beans.factory.support.DefaultListableBeanFactory org.springframework.beans.factory.support.DefaultListableBeanFactory -Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@30f7f56b: defining beans [dataSource,sessionFactory,transactionManager,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; root of factory hierarchy
1623 [main] ERROR org.springframework.test.context.TestContextManager org.springframework.test.context.TestContextManager -Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@4099d33d] to prepare test instance [test.TestPersonaDAOImpl@32fb6aed]
java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:157)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:321)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runReflectiveCall(SpringJUnit4ClassRunner.java:288)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:290)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access[=12=]0(ParentRunner.java:50)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:222)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
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 'transactionManager' defined in URL [file:/home/rugar/Documents/workspace-sts-3.6.2.RELEASE/struts-spring-hibernate/target/test-classes/datasource-test.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'org.hibernate.internal.SessionFactoryImpl' to required type 'javax.sql.DataSource' for property 'dataSource'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [org.hibernate.internal.SessionFactoryImpl] to required type [javax.sql.DataSource] for property 'dataSource': no matching editors or conversion strategy found
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:103)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:1)
at org.springframework.test.context.support.DelegatingSmartContextLoader.loadContext(DelegatingSmartContextLoader.java:228)
at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:124)
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:148)
... 24 more
Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'org.hibernate.internal.SessionFactoryImpl' to required type 'javax.sql.DataSource' for property 'dataSource'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [org.hibernate.internal.SessionFactoryImpl] to required type [javax.sql.DataSource] for property 'dataSource': no matching editors or conversion strategy found
at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:485)
at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:516)
at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:510)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1406)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1365)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
... 37 more
Caused by: java.lang.IllegalStateException: Cannot convert value of type [org.hibernate.internal.SessionFactoryImpl] to required type [javax.sql.DataSource] for property 'dataSource': no matching editors or conversion strategy found
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:241)
at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:470)
... 43 more
测试Class:
package test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import java.util.List;
import mx.com.gm.capadatos.PersonaDAO;
import mx.com.gm.capadatos.domain.Persona;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:datasource-test.xml", "classpath*:applicationContext.xml"})
public class TestPersonaDAOImpl {
private static Log logger = LogFactory.getLog("TestPersonaDAOImpl");
@Autowired
private PersonaDAO personaDao;
@Test
@Transactional
public void deberiaMostrarPersonas(){
try{
System.out.println();
logger.info("Inicio del Test deberiaMostrarPersonas");
List<Persona> personas = personaDao.findAllPersonas();
int contadorPersonas = 0;
for(Persona persona: personas){
logger.info("Persona: " + persona);
contadorPersonas++;
}
// Debería de haber la misma cantidad de personas
assertEquals(contadorPersonas, personaDao.contadorPersonas());
logger.info("Fin del test deberiaMostrarPersonas");
}
catch(Exception e)
{
logger.error("Error JBDC", e);
}
}
}
这是 ApplicationContext:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="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-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
<tx:annotation-driven/>
<context:component-scan base-package="mx.com.gm.capaservicio" />
<context:component-scan base-package="mx.com.gm.capadatos" />
</beans>
这是测试的应用程序上下文:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd">
<jdbc:embedded-database id="dataSource" type="H2">
<jdbc:script location="classpath:esquema.sql"/>
<jdbc:script location="classpath:datos.sql"/>
</jdbc:embedded-database>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
p:dataSource-ref="dataSource">
<property name="packagesToScan">
<list>
<value>mx.com.gm.capadatos.domain</value>
</list>
</property>
<property name="hibernateProperties">
<value>hibernate.format_sql=true hibernate.show_sql=true
hibernate.dialect=org.hibernate.dialect.H2Dialect</value>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager"
p:dataSource-ref="sessionFactory" />
</beans>
工具Class
package mx.com.gm.capadatos;
import java.util.List;
import mx.com.gm.capadatos.domain.Persona;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
public class PersonaDAOImpl implements PersonaDAO{
private SessionFactory sessionFactory;
@Autowired
public PersonaDAOImpl(SessionFactory sessionFactory){
this.sessionFactory = sessionFactory;
}
private Session currentSession(){
return sessionFactory.getCurrentSession();
}
public void insertPersona(Persona persona) {
currentSession().saveOrUpdate(persona);
}
public void updatePersona(Persona persona) {
currentSession().update(persona);
}
public void deletePersona(Persona persona) {
currentSession().delete(persona);
}
public Persona findPersonaById(long idPersona) {
return (Persona) currentSession().get(Persona.class, idPersona);
}
@SuppressWarnings("unchecked")
public List<Persona> findAllPersonas() {
return currentSession().createQuery("from Persona").list();
}
public long contadorPersonas() {
Long contador = (Long) currentSession().createCriteria(Persona.class)
.setProjection(Projections.rowCount()).uniqueResult();
return contador.longValue();
}
public Persona getPersonaByEmail(Persona persona) {
Example persoEjemplo = Example.create(persona);
return (Persona) currentSession().createCriteria(Persona.class)
.add(persoEjemplo).uniqueResult();
}
}
您可以使用:
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
如果您想创建 HibernateTransactionManager
和 sessionFactory