Transaktionen Spring

Status
Nicht offen für weitere Antworten.
G

Gast2

Gast
Hallo zusammen,

ich hab meine DAOs Impl mit Hibernate realisiert und mach mich nur mit Spring an die Service Schicht, wie realisiert man am besten Transaktionen in der Service Schicht?

Danke schon mal =)
 

byte

Top Contributor
DAO: @Transactional(propagation = Propagation.MANDATORY)
Service: @Transactional(propagation = Propagation.REQUIRED)

So lassen sich DAO Methoden nur mit offener Transaktion ausführen.
 
G

Gast2

Gast
Ah Ok werd ich mal ausprobieren. Danke!!

Kann man die Annotations schon in den interfaces machen oder erst in der Implmentierung?

Wie mache ich dann ein rollback oder commit?

DAO: @Transactional(propagation = Propagation.MANDATORY)
Service: @Transactional(propagation = Propagation.REQUIRED)

So lassen sich DAO Methoden nur mit offener Transaktion ausführen.

Aber so würde ich meine DAOs von Spring abhängig machen. Ist das sinnvoll oder spricht was dagegen?
 
M

maki

Gast
Wie mache ich dann ein rollback oder commit?
Lies doch mal die Doku zu @Transactional ;)
Du machst das gar nicht mehr (wozu auch??).

Aber so würde ich meine DAOs von Spring abhängig machen. Ist das sinnvoll oder spricht was dagegen?
Spring bietet speziell für DAOs viel Unterstützung (Templates für JDBC, Hibernate, JDO, iBatis...), bytos Vorschlag gefällt mir sehr gut :)
 

byte

Top Contributor
Aber so würde ich meine DAOs von Spring abhängig machen. Ist das sinnvoll oder spricht was dagegen?

Der Code ist nicht abhängig von Spring, aber Du hast halt die Imports der Annotations drin. Wenn Du das nicht willst, kannst Du das gleiche auch mit XML Konfiguration erreichen. Wie das geht steht in der Spring Doku.
 
G

Gast2

Gast
Alles klar danke... jetzt hab ich auf jeden Fall mal einen Ansatzpunkt ;)

Lies doch mal die Doku zu @Transactional ;)
Du machst das gar nicht mehr (wozu auch??).


Spring bietet speziell für DAOs viel Unterstützung (Templates für JDBC, Hibernate, JDO, iBatis...), bytos Vorschlag gefällt mir sehr gut :)

Also byto hat hier den 3 ways of integrating Hibernate and Spring | Benjamin Winterberg Punkt 3 vorgeschlagen.
Wenn ich das richtig verstanden hab, dann ist Spring ab der Hibernate 3.0 nicht mehr nötig.

Der Code ist nicht abhängig von Spring, aber Du hast halt die Imports der Annotations drin. Wenn Du das nicht willst, kannst Du das gleiche auch mit XML Konfiguration erreichen. Wie das geht steht in der Spring Doku.

Annotations gefallen mir besser =)...
 

byte

Top Contributor
Also byto hat hier den 3 ways of integrating Hibernate and Spring | Benjamin Winterberg Punkt 3 vorgeschlagen.
Wenn ich das richtig verstanden hab, dann ist Spring ab der Hibernate 3.0 nicht mehr nötig.

Das habe ich nicht geschrieben. Springs HibernateTemplate ist ab Hibernate 3.0 nicht mehr nötig! Denn Hibernate hat nun durch den Current Session Context ein eigenes Session Management. Das hat früher Spring übernommen.

Spring ist aber immernoch sinnvoll für den Hibernate-Einsatz und übernimmt dann folgende Aufgaben:
  1. Deklaratives Transaction Management
  2. Exception-Wrapping (DataAcessExceptions)
 
G

Gast2

Gast
Das habe ich nicht geschrieben. Springs HibernateTemplate ist ab Hibernate 3.0 nicht mehr nötig! Denn Hibernate hat nun durch den Current Session Context ein eigenes Session Management. Das hat früher Spring übernommen.

Spring ist aber immernoch sinnvoll für den Hibernate-Einsatz und übernimmt dann folgende Aufgaben:
  1. Deklaratives Transaction Management
  2. Exception-Wrapping (DataAcessExceptions)

Ah ok sorry für meine falsch Aussage...
 
G

Gast2

Gast
Noch eine Frage was ist besser die Annotation an das Interface oder an die Implementierung?

Also ich habs mal so versucht
Java:
public interface KundenService {
	
	@Transactional(propagation = Propagation.REQUIRED)
	public Kunde searchKundeById(Long id);
}

Java:
public class KundenServiceImpl implements KundenService{
	
	private KundenDAO kundenDAO;

	public void setKundenDAO(KundenDAO kundenDAO) {
		this.kundenDAO = kundenDAO;
	}

	@Override
	public Kunde searchKundeById(Long id) {
		return kundenDAO.getKundeById(id);
	}

	public KundenDAO getKundenDAO() {
		return kundenDAO;
	}

}

Java:
public interface KundenDAO {

	@Transactional(propagation = Propagation.MANDATORY)
	Kunde getKundeById(Long id);
}

Java:
public class HibernateKundenDAOImpl implements KundenDAO{

	
	private SessionFactory sessionFactory;

	
	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	@Override
	public Kunde getKundeById(Long id) {
		return (Kunde) sessionFactory.getCurrentSession().load(Kunde.class, id);
	}


}

Java:
org.hibernate.HibernateException: load is not valid without active transaction
	at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:338)
	at $Proxy7.load(Unknown Source)
	at dao.impl.HibernateKundenDAOImpl.getKundeById(HibernateKundenDAOImpl.java:27)
	at service.impl.KundenServiceImpl.searchKundeById(KundenServiceImpl.java:42)
	at kunde.KundenServiceTest.testCreateKunde(KundenServiceTest.java:18)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at junit.framework.TestCase.runTest(TestCase.java:168)
	at junit.framework.TestCase.runBare(TestCase.java:134)
	at junit.framework.TestResult$1.protect(TestResult.java:110)
	at junit.framework.TestResult.runProtected(TestResult.java:128)
	at junit.framework.TestResult.run(TestResult.java:113)
	at junit.framework.TestCase.run(TestCase.java:124)
	at junit.framework.TestSuite.runTest(TestSuite.java:232)
	at junit.framework.TestSuite.run(TestSuite.java:227)
	at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:79)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
 
Zuletzt bearbeitet von einem Moderator:

Noctarius

Top Contributor
Normal packt man die Annotation an die Implementierung, da es ja auch Implementierungen ohne benötigte Transaktion geben könnte. Die Spring-Doku sagt das aber auch mein ich :)
 

Noctarius

Top Contributor
Annotation an die Methoden der Implementierung. Z.B. muss eine findByX Methode keine Transaktion haben.
 

Noctarius

Top Contributor
Hast du das @Transactional denn jetzt an die Methode gepackt? Die Fehlermeldung kam vermutlich, weil das Interface annotiert war aber die Implementierung nicht, damit gab es keine echte Transaktion.
 
G

Gast2

Gast
Hast du das @Transactional denn jetzt an die Methode gepackt? Die Fehlermeldung kam vermutlich, weil das Interface annotiert war aber die Implementierung nicht, damit gab es keine echte Transaktion.

Nee noch nicht... Des war nur darauf bezogen weil du gesagt hast für findXbyY braucht man keine Transaktion deshalb.
Die Fehlermeldung kam auch wo ich das @Transactional an die Implementierung gemacht hab.
Jetzt versuch ich es noch an der Methode ;) vielleicht klappt das =)...

Aber ich dachte wenn ich das @Transactional an die Implementierung mache dann zählt das für alle Methoden.
 
G

Gast2

Gast
So jetzt mal ein ausführliches Beispiel

applicationContext.xml

[XML]
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
Index of /schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
Index of /schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
Index of /schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

<context:annotation-config/>
<!-- enable the configuration of transactional behavior based on annotations -->
<tx:annotation-driven transaction-manager="txManager" />

<!-- a PlatformTransactionManager is still required -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties"></property>
</bean>

<!-- the DataSource (parameterized for configuration via a PropertyPlaceHolderConfigurer) -->
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>

<!-- Hibernate -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
<property name="configLocation" value="hibernate.cfg.xml" />
<property name="dataSource" ref="dataSource" />
</bean>


<!-- Hibernate DAO -->
<bean id="kundenDAO" class="dao.impl.HibernateKundenDAOImpl">
</bean>

<!-- Services -->
<bean id="kundenService" class="service.impl.KundenServiceImpl">
<property name="kundenDAO" >
<ref bean="kundenDAO"/>
</property>
</bean>
</beans>
[/XML]

TestCase
Java:
public class KundenServiceTest extends TestCase {
	
	public void testCreateKunde() throws Exception {
		ClassPathResource res = new ClassPathResource("applicationContext.xml");
		XmlBeanFactory factory = new XmlBeanFactory(res);
		KundenService kundenService = factory.getBean("kundenService", KundenService.class);
		Kunde kunde = kundenService.searchKundeById(Long.valueOf(1));
		assertEquals(Long.valueOf(1), kunde.getId());
	}
}

Service Klasse
Java:
public class KundenServiceImpl implements KundenService{
	
	private KundenDAO kundenDAO;
	
	@Transactional(propagation = Propagation.REQUIRED)
	@Override
	public Kunde searchKundeById(Long id) {
		return kundenDAO.getKundeById(id);
	}

	public void setKundenDAO(KundenDAO kundenDAO) {
		this.kundenDAO = kundenDAO;
	}

	public KundenDAO getKundenDAO() {
		return kundenDAO;
	}
}

Java:
public class HibernateKundenDAOImpl implements KundenDAO{

	@Autowired
	private SessionFactory sessionFactory;

//	public SessionFactory getSessionFactory() {
//		return sessionFactory;
//	}
//
//	public void setSessionFactory(SessionFactory sessionFactory) {
//		this.sessionFactory = sessionFactory;
//	}
	
	@Transactional(propagation = Propagation.MANDATORY)
	@Override
	public Kunde getKundeById(Long id) {
		return (Kunde) sessionFactory.getCurrentSession().load(Kunde.class, id);
	}
}
 
G

Gast2

Gast
Das hier hab ich auch schon versucht
[XML]
<bean id="txManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
[/XML]

Unterschied versteh ich noch nicht ganz... aber klappt mit beidem net :bahnhof:
 

byte

Top Contributor
Benutzt Du Hibernate Annotations? Dann benutz mal lieber statt Local die
Code:
org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean
 
G

Gast2

Gast
Benutzt Du Hibernate Annotations? Dann benutz mal lieber statt Local die
Code:
org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean

benutz die javax.persistence Annotations ...

und die anderen sind halt die spring annotations--> die wo auch nicht gehen die hibernate funktionieren ja... aber ich versuch mal des ...
 

Noctarius

Top Contributor
Das sieht doch schon sehr vielversprechend (äh fehlerhaft aus :D)

Du Initialisierst Spring mit der falschen Art BeanFactory. Um Annotations zu nutzen musst du meines Wissens nach keine einfache BeanFactory sondern einen ausgewachsenen ApplicationContext nutzen. Diesen kannst du initialisieren wie in der Spring-Doku erklärt: Chapter3.The IoC container

Damit dürften sich dann gleiche beide Probleme erledigt haben. Ohne ApplicationContext gibt es nämlich auch keine AOP Unterstützung.

PS: Falls du AOP nutzen willst musst du eventuell noch den Java-Agent von Spring einsetzen.
 
G

Gast2

Gast
Das sieht doch schon sehr vielversprechend (äh fehlerhaft aus :D)

Du Initialisierst Spring mit der falschen Art BeanFactory. Um Annotations zu nutzen musst du meines Wissens nach keine einfache BeanFactory sondern einen ausgewachsenen ApplicationContext nutzen. Diesen kannst du initialisieren wie in der Spring-Doku erklärt: Chapter3.The IoC container

Damit dürften sich dann gleiche beide Probleme erledigt haben. Ohne ApplicationContext gibt es nämlich auch keine AOP Unterstützung.

PS: Falls du AOP nutzen willst musst du eventuell noch den Java-Agent von Spring einsetzen.

Erstmal danke für eure Geduld :D :D...

Sieht jetzt so aus
Java:
public class KundenServiceTest extends TestCase {
	
	public void testCreateKunde() throws Exception {
		ApplicationContext context = new ClassPathXmlApplicationContext(
		        new String[] {"applicationContext.xml"});
		KundenService kundenService = context.getBean("kundenService", KundenService.class);
		Kunde kunde = kundenService.searchKundeById(Long.valueOf(1));
		assertEquals(Long.valueOf(1), kunde.getId());
	}
}

Fehler
Java:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0': BeanPostProcessor before instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:446)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:289)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:286)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:188)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:543)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:730)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:387)
	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)
	at kunde.KundenServiceTest.testCreateKunde(KundenServiceTest.java:14)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at junit.framework.TestCase.runTest(TestCase.java:168)
	at junit.framework.TestCase.runBare(TestCase.java:134)
	at junit.framework.TestResult$1.protect(TestResult.java:110)
	at junit.framework.TestResult.runProtected(TestResult.java:128)
	at junit.framework.TestResult.run(TestResult.java:113)
	at junit.framework.TestCase.run(TestCase.java:124)
	at junit.framework.TestSuite.runTest(TestSuite.java:232)
	at junit.framework.TestSuite.run(TestSuite.java:227)
	at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:79)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice
	at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.isInfrastructureClass(AbstractAutoProxyCreator.java:384)
	at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(AbstractAutoProxyCreator.java:278)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:831)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:803)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:440)
	... 29 more
Caused by: java.lang.ClassNotFoundException: org.aopalliance.aop.Advice
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClassInternal(Unknown Source)
	... 34 more
 

Noctarius

Top Contributor
Steht doch da: Caused by: java.lang.ClassNotFoundException: org.aopalliance.aop.Advice

Ergo fehlt dir eine Abhängigkeit. Nähmlich das API Set von der AOP Alliance. Maven ist ein toller Begleiter auf dem Weg zur Springanwendung :)
 
G

Gast2

Gast
Steht doch da: Caused by: java.lang.ClassNotFoundException: org.aopalliance.aop.Advice

Ergo fehlt dir eine Abhängigkeit. Nähmlich das API Set von der AOP Alliance. Maven ist ein toller Begleiter auf dem Weg zur Springanwendung :)

Das ist mir bewusst ;)...
ich hab mit die aopalliance.jar runtergeladen aber die Klasse ist nicht dabei, darum frag ich mich woher ich die bekomm?

EDIT: ok ich hab die com.springsource.org.aopalliance-1.0.0 gefunden =)


Wir kommen näher dran ;)

Java:
org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (socket creation error)
	at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:241)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:372)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:336)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:102)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	at $Proxy10.searchKundeById(Unknown Source)
	at kunde.KundenServiceTest.testCreateKunde(KundenServiceTest.java:18)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at junit.framework.TestCase.runTest(TestCase.java:168)
	at junit.framework.TestCase.runBare(TestCase.java:134)
	at junit.framework.TestResult$1.protect(TestResult.java:110)
	at junit.framework.TestResult.runProtected(TestResult.java:128)
	at junit.framework.TestResult.run(TestResult.java:113)
	at junit.framework.TestCase.run(TestCase.java:124)
	at junit.framework.TestSuite.runTest(TestSuite.java:232)
	at junit.framework.TestSuite.run(TestSuite.java:227)
	at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:79)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (socket creation error)
	at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1228)
	at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:884)
	at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:203)
	... 26 more
Caused by: java.sql.SQLException: socket creation error
	at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
	at org.hsqldb.jdbc.jdbcConnection.<init>(Unknown Source)
	at org.hsqldb.jdbcDriver.getConnection(Unknown Source)
	at org.hsqldb.jdbcDriver.connect(Unknown Source)
	at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
	at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:294)
	at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1340)
	at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1224)
	... 28 more
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
[XML]
<!-- a PlatformTransactionManager is still required
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>-->

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
[/XML]

Also wenn ich den HibernateTransactionManager verwende bekomme ich die Fehlermeldung weg...
Versteh den unterschied zwischen den beiden noch nicht ganz?
Hab so verstanden der DataSourceTransactionManager ist nur dafür das wenn ich per JDBC ohne Hibernate zugriff habe. Und der andere ist notwendig damit ich die sessionFacotry eine Session anlegt.
Hab ich dann die ganze Anwendung nur eine Session und eine SessionFactory?


Also die sessionFacotry ist nimmer null also ein Problem gelöst, aber
bekomm immer noch die Fehlermeldung
Java:
org.hibernate.HibernateException: load is not valid without active transaction
	at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:338)
	at $Proxy12.load(Unknown Source)
	at dao.impl.HibernateKundenDAOImpl.getKundeById(HibernateKundenDAOImpl.java:30)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	at $Proxy9.getKundeById(Unknown Source)
	at service.impl.KundenServiceImpl.searchKundeById(KundenServiceImpl.java:42)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	at $Proxy10.searchKundeById(Unknown Source)
	at kunde.KundenServiceTest.testCreateKunde(KundenServiceTest.java:18)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at junit.framework.TestCase.runTest(TestCase.java:168)
	at junit.framework.TestCase.runBare(TestCase.java:134)
	at junit.framework.TestResult$1.protect(TestResult.java:110)
	at junit.framework.TestResult.runProtected(TestResult.java:128)
	at junit.framework.TestResult.run(TestResult.java:113)
	at junit.framework.TestCase.run(TestCase.java:124)
	at junit.framework.TestSuite.runTest(TestSuite.java:232)
	at junit.framework.TestSuite.run(TestSuite.java:227)
	at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:79)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
Fang doch noch mal sauber nach nem Tutorial an

lol?
Es sind keine 50 Zeilen code^^... ich glaube nicht dass ich noch ein leichteres Beispiel finde

[XML]
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
Index of /schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
Index of /schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
Index of /schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

<context:annotation-config/>
<!-- enable the configuration of transactional behavior based on annotations -->
<tx:annotation-driven transaction-manager="txManager" />

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties"></property>
</bean>

<!-- the DataSource (parameterized for configuration via a PropertyPlaceHolderConfigurer) -->
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>

<!-- Hibernate -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
<property name="configLocation" value="hibernate.cfg.xml" />
<property name="dataSource" ref="dataSource" />
</bean>


<!-- Hibernate DAO -->
<bean id="kundenDAO" class="dao.impl.HibernateKundenDAOImpl">
</bean>

<!-- Services -->
<bean id="kundenService" class="service.impl.KundenServiceImpl">
</bean>


</beans>
[/XML]
 
Zuletzt bearbeitet von einem Moderator:

Noctarius

Top Contributor
Doch z.B. erstmal ohne AOP. Langsam nach und nach alles einbauen.

Abgesehen davon habe ich außer dem JAR der AOP-Alliance und Spring-AOP (inkl CGLIB) keine weiteren Abhängigkeiten für AOP. Und die obige Fehlermeldung zeigt eindeutig eine Class aus dem Alliance JAR, also vielleicht falsche Version des JAR?

Wie gesagt, bei Spring ist es nie falsch sich gleich mit Maven anzufreunden, da hast du solche Probleme mit fehlenden Abhängigkeiten nicht.
 
G

Gast2

Gast
Abgesehen davon habe ich außer dem JAR der AOP-Alliance und Spring-AOP (inkl CGLIB) keine weiteren Abhängigkeiten für AOP. Und die obige Fehlermeldung zeigt eindeutig eine Class aus dem Alliance JAR, also vielleicht falsche Version des JAR?

Welche jars hast du den dann kann ich mal vergleichen ob ich die richtigen hab??

Ja es hat eigentlich soweit alles mit Spring geklappt, nur die Transaktionen wollen nicht so richtig.
Und so wie ich das verstanden hab brauch ich fürs Declarative transaction management AOP.
Oder meinst du ich soll erstmal versuchen eine Transaktion programmatisch anzulegen mit dem PlatformTransactionManager???
 

Noctarius

Top Contributor
Ich hab keine Ahnung wie das mit Hibernate aussehen muss. Bei JPA ist das ganz anders (siehe unten):
[xml] <tx:annotation-driven transaction-manager="transactionManager"
proxy-target-class="true" />
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

...

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
<property name="dataSource" ref="dataSource" />
</bean>[/xml]

Die Abhängigkeiten kann ich dir nicht genau nennen, weil Maven die verwaltet. Abgesehen davon nutze ich teils, SpringSource Repackaged Packages, weil wir OSGi nutzen.
 
Zuletzt bearbeitet:
G

Gast2

Gast
Ich hab keine Ahnung wie das mit Hibernate aussehen muss. Bei JPA ist das ganz anders (siehe unten):
[xml] <tx:annotation-driven transaction-manager="transactionManager"
proxy-target-class="true" />
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

...

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
<property name="dataSource" ref="dataSource" />
</bean>[/xml]

Die Abhängigkeiten kann ich dir nicht genau nennen, weil Maven die verwaltet. Abgesehen davon nutze ich teils, SpringSource Repackaged Packages, weil wir OSGi nutzen.

Ah ok... Ja hau ich wohl AOP nochmal raus und mach das Chapter 8 und 9 nochmal durch... Habs zwar schon paar mal gelesen ob ich was finde, was falsch ist :D...

Da ich das nur daheim zum Lernen nehm wollte ich mich jetzt nicht noch in Maven einarbeiten und das aufsetzen. Aber kommt noch, man kann ja nicht alles aufeinmal machen ...
 

byte

Top Contributor
Also...

Deine Konfiguration mit dem HibernateTransactionManager ist richtig, wenn Du mit SessionFactory und Session arbeitest. Das was Noctarius schreibt bezieht sich auf den reinen JPA-Weg, also ohne SessionFactory und Session, stattdessen mit EntityManagerFactory und EntityManager. Du musst Dich für einen der beiden Wege entscheiden und darfst die Konfiguration nicht mischen.

Wichtig ist, dass Du - da Du offenbar JUnit 3.8 verwendest - Deine Tests von
Code:
AbstractTransactionalJUnit38SpringContextTests
ableitest, damit Spring vor dem Test eine Transaktion aufmacht und nach dem Test ein Rollback macht.
 

Noctarius

Top Contributor
Hatte ich ja erwähnt, dass das da JPA und nicht Hibernate pur ist :)

(Ich bleib lieber bei meinem geliebten EclipseLink *hust*)
 

byte

Top Contributor
Hier mal eine Hibernate Konfiguration für Spring, die funktioniert:

[XML]<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
Index of /schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
Index of /schema/context http://www.springframework.org/schema/context/spring-context.xsd
Index of /schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
Index of /schema/util http://www.springframework.org/schema/util/spring-util.xsd">


<context:annotation-config />

<context:property-placeholder location="classpath:unittest.properties" />

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" lazy-init="false">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<util:properties>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
<prop key="hibernate.default_schema">${hibernate.default_schema}</prop>
<prop key="hibernate.cache.provider_class">${hibernate.cache.provider_class}</prop>
<prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop>
<prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>
<prop key="hibernate.jdbc.batch_size">100</prop>
</util:properties>
</property>
<property name="annotatedClasses">
<util:list>
<value>de.blub.FoobarImpl</value>
</util:list>
</property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>[/XML]

Java:
@ContextConfiguration(locations={"/testContext.xml"})
@TransactionConfiguration(defaultRollback=true)
public class FoobarTest extends AbstractTransactionalJUnit38SpringContextTests {
    
    @Autowired
    private FoobarDaoImpl dao;

    @Test
    public void testFind() {
        dao.find(); // ...
    }
	
}
 
G

Gast2

Gast
Also...

Deine Konfiguration mit dem HibernateTransactionManager ist richtig, wenn Du mit SessionFactory und Session arbeitest. Das was Noctarius schreibt bezieht sich auf den reinen JPA-Weg, also ohne SessionFactory und Session, stattdessen mit EntityManagerFactory und EntityManager. Du musst Dich für einen der beiden Wege entscheiden und darfst die Konfiguration nicht mischen.

Wichtig ist, dass Du - da Du offenbar JUnit 3.8 verwendest - Deine Tests von
Code:
AbstractTransactionalJUnit38SpringContextTests
ableitest, damit Spring vor dem Test eine Transaktion aufmacht und nach dem Test ein Rollback macht.

Mhm nö eigentlich JUnit4, aber das AbstractTransactionalJUnit38SpringContextTests werd ich mal versuchen =)

Hier mal eine Hibernate Konfiguration für Spring, die funktioniert:

[XML]<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
Index of /schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
Index of /schema/context http://www.springframework.org/schema/context/spring-context.xsd
Index of /schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
Index of /schema/util http://www.springframework.org/schema/util/spring-util.xsd">


<context:annotation-config />

<context:property-placeholder location="classpath:unittest.properties" />

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" lazy-init="false">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<util:properties>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
<prop key="hibernate.default_schema">${hibernate.default_schema}</prop>
<prop key="hibernate.cache.provider_class">${hibernate.cache.provider_class}</prop>
<prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop>
<prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>
<prop key="hibernate.jdbc.batch_size">100</prop>
</util:properties>
</property>
<property name="annotatedClasses">
<util:list>
<value>de.blub.FoobarImpl</value>
</util:list>
</property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>[/XML]

Java:
@ContextConfiguration(locations={"/testContext.xml"})
@TransactionConfiguration(defaultRollback=true)
public class FoobarTest extends AbstractTransactionalJUnit38SpringContextTests {
    
    @Autowired
    private FoobarDaoImpl dao;

    @Test
    public void testFind() {
        dao.find(); // ...
    }
	
}



Das werd ich mal versuchen und vergleichen =)...
2 Fragen:
1. Was macht <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /> genau???
2. Was steht in der xml(@ContextConfiguration(locations={"/testContext.xml"}) )
 
Zuletzt bearbeitet von einem Moderator:

byte

Top Contributor
Hatte was von JUnit 3.8 im Stacktrace oben gelesen, daher die Vermutung. Wenn Du JUnit 4 benutzt, dann nimm die Testklasse
Code:
AbstractTransactionalJUnit4SpringContextTests
.

zu 1.) Die Bean übersetzt Hibernate Exceptions in DataAccessExceptions. Das ist eine Persistenz-unabhängige Exception Hierarchie. Die Exceptions sind häufig viel aussagefähiger als die reinen Hibernate oder SQL Exceptions.

zu 2.) testContext.xml beinhaltet mindestens genau das, was ich oben an Konfiguration gepostet habe.
 
G

Gast2

Gast
Hatte was von JUnit 3.8 im Stacktrace oben gelesen, daher die Vermutung. Wenn Du JUnit 4 benutzt, dann nimm die Testklasse
Code:
AbstractTransactionalJUnit4SpringContextTests
.

zu 1.) Die Bean übersetzt Hibernate Exceptions in DataAccessExceptions. Das ist eine Persistenz-unabhängige Exception Hierarchie. Die Exceptions sind häufig viel aussagefähiger als die reinen Hibernate oder SQL Exceptions.

zu 2.) testContext.xml beinhaltet mindestens genau das, was ich oben an Konfiguration gepostet habe.

ah achso der lädt den context gleich jetzt hab ichs ;)... thx versuch ich die woche mal =)
 
G

Gast2

Gast
Ah was ich bei deinem Test auch nicht ganz verstanden hab warum du die Implmentation nimmst und nicht das Interface?
 
G

Gast2

Gast
Ja dachte ist praktischer das Interface zu defnieren und die Implmentation im XML festzulegen...
Aber gut stimmt man sollte für jede Implmentation einen Test haben.
 
G

Gast2

Gast
Muss ich die Implentation dann auch in der test xml aufnehmen?
In deinem Beispiel

[XML]
<bean id="foobarDaoImpl" class="de.blub.FoobarDaoImpl"/>
[/XML]

Weil ich bekomme immer die Fehlernachticht

Java:
19.11.2009 23:38:09 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [testContext.xml]
19.11.2009 23:38:09 org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.GenericApplicationContext@78aa80: startup date [Thu Nov 19 23:38:09 CET 2009]; root of context hierarchy
19.11.2009 23:38:09 org.springframework.core.io.support.PropertiesLoaderSupport loadProperties
INFO: Loading properties file from class path resource [jdbc.properties]
19.11.2009 23:38:10 org.springframework.context.support.AbstractApplicationContext$BeanPostProcessorChecker postProcessAfterInitialization
INFO: Bean 'dataSource' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
19.11.2009 23:38:10 org.springframework.orm.hibernate3.LocalSessionFactoryBean buildSessionFactory
INFO: Building new Hibernate SessionFactory
19.11.2009 23:38:11 org.springframework.context.support.AbstractApplicationContext$BeanPostProcessorChecker postProcessAfterInitialization
INFO: Bean 'sessionFactory' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
19.11.2009 23:38:11 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@fccada: defining beans [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.beans.factory.config.PropertyPlaceholderConfigurer#0,org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,dataSource,sessionFactory,transactionManager,kundenDAO,kundenServiceImpl]; root of factory hierarchy
19.11.2009 23:38:12 org.springframework.orm.hibernate3.HibernateTransactionManager afterPropertiesSet
INFO: Using DataSource [org.apache.commons.dbcp.BasicDataSource@54864c] of Hibernate SessionFactory for HibernateTransactionManager
19.11.2009 23:38:12 org.springframework.test.context.TestContextManager prepareTestInstance
SCHWERWIEGEND: Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@128d900] to prepare test instance [kunde.KundenServiceTest@be95bf]
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'kunde.KundenServiceTest': Autowiring of fields failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private service.impl.KundenServiceImpl kunde.KundenServiceTest.kundenService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [service.impl.KundenServiceImpl] is defined: Unsatisfied dependency of type [class service.impl.KundenServiceImpl]: expected at least 1 matching bean
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(AutowiredAnnotationBeanPostProcessor.java:280)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1011)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:374)
	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:110)
	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:333)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:220)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:301)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:303)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
	at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private service.impl.KundenServiceImpl kunde.KundenServiceTest.kundenService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [service.impl.KundenServiceImpl] is defined: Unsatisfied dependency of type [class service.impl.KundenServiceImpl]: expected at least 1 matching bean
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:497)
	at org.springframework.beans.factory.annotation.InjectionMetadata.injectFields(InjectionMetadata.java:105)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(AutowiredAnnotationBeanPostProcessor.java:277)
	... 26 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [service.impl.KundenServiceImpl] is defined: Unsatisfied dependency of type [class service.impl.KundenServiceImpl]: expected at least 1 matching bean
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:751)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:666)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:468)
	... 28 more
19.11.2009 23:38:12 org.springframework.context.support.AbstractApplicationContext doClose
INFO: Closing org.springframework.context.support.GenericApplicationContext@78aa80: startup date [Thu Nov 19 23:38:09 CET 2009]; root of context hierarchy
19.11.2009 23:38:12 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
INFO: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@fccada: defining beans [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.beans.factory.config.PropertyPlaceholderConfigurer#0,org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,dataSource,sessionFactory,transactionManager,kundenDAO,kundenServiceImpl]; root of factory hierarchy
19.11.2009 23:38:12 org.springframework.orm.hibernate3.AbstractSessionFactoryBean destroy
INFO: Closing Hibernate SessionFactory

Test
Java:
@ContextConfiguration(locations={"/testContext.xml"})
@TransactionConfiguration(defaultRollback=true)
public class KundenServiceTest extends AbstractTransactionalJUnit4SpringContextTests {
	
	@Autowired
	private KundenServiceImpl kundenService;
	
	@Test
	public void testSerchKunde() throws Exception {
		Kunde kunde = kundenService.searchKundeById(Long.valueOf(1));
		assertEquals(Long.valueOf(1), kunde.getId());
	}
}

testContext.xml

[XML]
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
Index of /schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
Index of /schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
Index of /schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">


<context:annotation-config />

<context:property-placeholder location="classpath:jdbc.properties" />

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

<tx:annotation-driven transaction-manager="transactionManager" />

<!-- the DataSource (parameterized for configuration via a PropertyPlaceHolderConfigurer) -->
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource" lazy-init="false">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>

<!-- Hibernate -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
<property name="configLocation" value="hibernate.cfg.xml" />
<property name="dataSource" ref="dataSource" />
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

<!-- Services Mit und ohne diese Zeile versucht -->
<bean id="kundenServiceImpl" class="service.impl.KundenServiceImpl"/>

</beans>
[/XML]


Die 2 Nachrichten machen mich auch noch stutzig
[XML]
INFO: Loading properties file from class path resource [jdbc.properties]
19.11.2009 23:38:10 org.springframework.context.support.AbstractApplicationContext$BeanPostProcessorChecker postProcessAfterInitialization
INFO: Bean 'dataSource' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
19.11.2009 23:38:10 org.springframework.orm.hibernate3.LocalSessionFactoryBean buildSessionFactory
INFO: Building new Hibernate SessionFactory
19.11.2009 23:38:11 org.springframework.context.support.AbstractApplicationContext$BeanPostProcessorChecker postProcessAfterInitialization
INFO: Bean 'sessionFactory' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[/XML]
 
Zuletzt bearbeitet von einem Moderator:

Noctarius

Top Contributor
Eigentlich nutzt man das Interface bei WireByType. Ergo im Sourcecode das Interface verwenden und im ApplicationContext.xml die Implementierung als Bean erstellen lassen. Spring nutzt dann automatisch die Implementierung beim Binden der Interfaces.
 
M

maki

Gast
Java:
    @Autowired
    private KundenService kundenService;
[xml]<bean id="kundenService" class="service.impl.KundenServiceImpl"/>
[/xml]
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Spring Transaktionen funktionieren nicht Application Tier 1
M Spring DM: Problem mit Tomcat als OSGI-Service Application Tier 1
G Spring/Hibernate exception Application Tier 17
S Spring: Klassen in anderer "Anmelden" Application Tier 16
RaoulDuke Spring - Bugfixes in 2.5.x Application Tier 4
G Spring rollbackFor Application Tier 8
MQue Spring Security Form Application Tier 3
D Spring konfigurieren mit XML, Annotionen oder Java? Application Tier 2
MQue Spring in Zukunft Application Tier 5
I Passwort verschlüsseln in DB mit Spring Application Tier 5
MQue Spring https Application Tier 7
I Security bei Spring? Application Tier 31
MQue Spring beans Application Tier 10
I Wieviel Projekte bei Spring? Webprojekt Application Tier 2
Y Spring und Hibernate Application Tier 2
K Spring DI existierendes Objekt übergeben Application Tier 2
G Spring applicationContext Application Tier 3
MQue Spring Autowired Application Tier 7
MQue Spring Proxys Application Tier 2
D Problem beim Testen von einer Spring-Anwendung Application Tier 8
MQue Spring BeanFactoryPostProcessor Application Tier 3
MQue Spring ApplicationContext Application Tier 20
S Spring util:list in eine andere importieren Application Tier 15
MQue Einsatz von Spring Application Tier 13
M Konfiguration WebApp/Spring Host-abhängig Application Tier 5
E Migration altes Framework (SOFIA) auf Spring Application Tier 3
D Automatische Typkonvertierung in Spring Application Tier 5
D Spring und Hbernate konfigurieren bzw. verschalten Application Tier 5
A Spring: JSP nimmt style.css nicht an Application Tier 3
G Spring Security Frage fuer Fortgeschrittene Application Tier 2
Y Spring + MyFaces - Exception bei Serverstart Application Tier 1
Y Maven MyFaces Hibernate Spring - Projekt Application Tier 1
byte [Spring] Referenced Bean not found Application Tier 2
M Spring - Leichtgewichtiger als JBoss? Application Tier 4
D Spring: setter injection von statischer Methode? Application Tier 1
reibi Spring Beans - Grundsatzfrage Application Tier 3
thE_29 Spring und XFire Frage Application Tier 3
H spring Application Tier 2
R Spring und Hibernate3 - CGLib Enhancement failed Application Tier 2
S Spring 2.0 Tutorial gesucht Application Tier 2
M JBoss Seam - Spring Application Tier 11
G [Spring+JSF]: VariableResolver und Scopes? Application Tier 1

Ähnliche Java Themen

Neue Themen


Oben