Spring 2.5.5 JBoss 4.2.2 Hibernate-Annotations (Dringend !)

Smokey67

Grünschnabel
Hallo Mitkämpfer,

ich habe ein Problem nach einem Update meiner Hibernate-Bibliotheken und weiß im Moment nicht weiter. Vor dem Update der Hibernate-Annotations auf 3.3.x und Spring auf
2.5.5 funktionierte noch alles. (Vorher Spring 2.0.8)
Wäre für einen hilfreichen Tip sehr dankbar !

Die Fehlermeldung beim Start des JBoss sagt, dass die DataSource PostgresDS nicht per JDNI gefunden werden kann, aber JBoss sagt, die Datasource sei gebunden worden.

benutzte Bibliotheken (soweit nur Spring und Hibernate aufgelistet, vielleicht passt hier was nicht: )
spring-2.5.5.jar
spring-core-2.5.5.jar
spring-beans-2.5.3.jar
spring-context-2.5.3.jar
spring-web-2.5.5.jar
hibernate-3.2.6.ga.jar
hibernate-annotations-3.3.1.GA.jar
hibernate-commons-annotations-3.3.0.ga.jar
hibernate-entitymanager-3.3.1.ga.jar
hibernate-validator-3.0.0.ga.jar
persistence-api-1.0.jar
ejb3-persistence-1.0.1.GA.jar


Der JBoss-Output (etwas gekürzt):

Code:
14:51:57,129 INFO  [Server] Starting JBoss (MX MicroKernel)...
  [...]
14:52:22,571 INFO  [ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=DefaultDS' to JNDI name 'java:DefaultDS'
  [...]
14:52:23,664 INFO  [ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=ConnectionFactoryBinding,name=JmsXA' to JNDI name 'java:JmsXA'
14:52:23,763 INFO  [ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=PostgresDS' to JNDI name 'java:PostgresDS'
  [...]
14:52:31,313 INFO  [STDOUT] 2008-09-21 14:52:31,311 DEBUG (org.springframework.beans.factory.support.DefaultListableBeanFactory:447) - Retrieved dependent beans for bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0': [org.springframework.transaction.config.internalTransactionAdvisor]
14:52:31,330 INFO  [STDOUT] 2008-09-21 14:52:31,317 ERROR (org.springframework.web.context.ContextLoader:215) - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personService': Injection of persistence methods failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.lookup.DataSourceLookupFailureException: Failed to look up JNDI DataSource with name 'java:/PostgresDS'; nested exception is javax.naming.NameNotFoundException: JNDI object with [java:/PostgresDS] not found: JNDI implementation returned null
	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:324)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:998)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:729)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:381)
	at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
	...


Meine persistence.xml:

XML:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">

 	<persistence-unit name="HouseMan" transaction-type="RESOURCE_LOCAL">
 	    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
		<!-- <non-jta-data-source>java:/PostgresDS</non-jta-data-source> --> 
		<jta-data-source>java:/PostgresDS</jta-data-source> 
		<class>net.magiccode.houseman.model.User</class>
        <class>net.magiccode.houseman.model.Right</class>
        <class>net.magiccode.houseman.model.UserGroup</class>
        <class>net.magiccode.houseman.model.BankAccount</class>
        <class>net.magiccode.houseman.model.Person</class>
        <class>net.magiccode.houseman.model.Address</class>
        <class>net.magiccode.houseman.model.RentalObject</class>
        <class>net.magiccode.houseman.i18n.Language</class>
        <class>net.magiccode.houseman.i18n.I18nText</class>
        <class>net.magiccode.houseman.i18n.MultiLingualText</class>
        <class>net.magiccode.houseman.i18n.LanguageFactory</class>
		<properties>
			<property name="jboss.entity.manager.factory.jndi.name" value="persistence-units/JpaPersistence"/>
			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />			
			<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
			<property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/houseman" />
			<property name="hibernate.connection.username" value="volker" />
			<property name="hibernate.connection.password" value="abulafia" />
			<property name="hibernate.archive.autodetection" value="class" />
			<property name="hibernate.default_schema" value="public" />
			<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.DefaultComponentSafeNamingStrategy"/>
			<property name="hibernate.archive.autodetection" value="class"/>
			<property name="hibernate.hbm2ddl.auto" value="read-write" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
		</properties>
	</persistence-unit>
 </persistence>

Meine 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: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.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

	<bean id="personService" class="net.magiccode.houseman.service.PersonServiceImpl" />
    <bean id="userService" class="net.magiccode.houseman.service.UserServiceImpl" />
    <bean id="rightService" class="net.magiccode.houseman.service.RightServiceImpl" />
    <bean id="groupService" class="net.magiccode.houseman.service.GroupServiceImpl" />
    <bean id="languageService" class="net.magiccode.houseman.service.LanguageServiceImpl" />
    <bean id="i18nTextService" class="net.magiccode.houseman.service.I18nTextServiceImpl" />

    <bean id="RentalObjectService" class="net.magiccode.houseman.service.RentalObjectServiceImpl" />
    <bean id="LanguageFactory" class="net.magiccode.houseman.i18n.LanguageFactory" />

    <bean id="personAction" scope="prototype"
        class="net.magiccode.houseman.action.PersonAction">
        <constructor-arg ref="personService" />
    </bean>
    <bean id="languageAction" scope="prototype"
        class="net.magiccode.houseman.action.LanguageAction">
        <constructor-arg ref="languageService" />
    </bean>
    
    <bean id="userAction" scope="prototype"
        class="net.magiccode.houseman.action.UserAction">
        <constructor-arg ref="userService" />
    </bean>
    <bean id="rightsAction" scope="prototype"
        class="net.magiccode.houseman.action.RightsAction">
        <constructor-arg ref="rightService" />
    </bean>
    <bean id="groupAction" scope="prototype"
        class="net.magiccode.houseman.action.GroupAction">
        <constructor-arg ref="groupService" />
    </bean>


	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
	  <property name="persistenceUnitName" value="HouseMan" />
	  <property name="jpaProperties">
	    <props>
	      <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
	    </props>
	  </property>	  
	   <property name="jpaVendorAdapter">
	       <bean
	           class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
	           <property name="database" value="POSTGRESQL" />
	           <property name="showSql" value="true" />
 					<property name="generateDdl" value="true" />
	       </bean>
	   </property>	  
	</bean>

	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
	  <property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>
 
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://localhost/houseman" />
        <property name="username" value="volker" />
        <property name="password" value="********" />
    </bean>
 
    <tx:annotation-driven transaction-manager="transactionManager" />
</beans>
 
Zuletzt bearbeitet von einem Moderator:
Mal abgesehen davon, dass du logischerweise ALLE Springbibliotheken inder gleichen Version verwenden solltest, könnte die Excepton nicht sprechender sein: unter dem Namen den du für die Datasource konfiguriert hast, gibt es im JNDI keine DataSource.

Kann es sein, dass du eigentlich die in der Springkonfiguration hinterlegte DataSource benutzen möchtest und gar keinen JNDI Loookup benötigst? In der Hibernatekonfig ist allerdings noch ein jta-data-source Element vorhanden, was vermutlich den Lookup provoziert.

Gruß
Ollie
 
Hallo Oliver,

erstmal vielen Dank für die schnelle Antwort. Ich muß zugeben, ich stehe hier etwas auf dem Schlauch :(
JBoss sagt doch "Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=PostgresDS' to JNDI name 'java:postgresDS'"
Wieso gibt es die im JNDI dann nicht ?
Ich möchte natürlich die in der Springkonfiguration hinterlegte DataSource nutzen, aber funktionieren dann die Annotations von Hibernate noch ? Könntest Du mir bitte eine kurze Erklärung liefern, die mir weiterhilft ?

Zu den Bibliotheken: Ich habe die im Maven-Repository vorhandenen Versionen benutzt. Da wo's keine 2.5.5 gab, habe ich die entsprechend letzte (2.5.3) genommen.....
 
Hallo Oliver,

erstmal vielen Dank für die schnelle Antwort. Ich muß zugeben, ich stehe hier etwas auf dem Schlauch :(
JBoss sagt doch "Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=PostgresDS' to JNDI name 'java:postgresDS'"
Wieso gibt es die im JNDI dann nicht ?
Du referenzierst aber eine java:/PostgresDS.

Ich möchte natürlich die in der Springkonfiguration hinterlegte DataSource nutzen, aber funktionieren dann die Annotations von Hibernate noch ? Könntest Du mir bitte eine kurze Erklärung liefern, die mir weiterhilft ?
Dafür definierst du doch eine LocalContainerEntityManagerFactoryBean. Frage - hast du die Spring JPA Doku gelesen? ;). Durch die Umfangreiche Konfiguration in der persistence.xml wirfst du halt zwei Konfigurationsmodelle durcheinander. Zugegebenermaßen würde ich da auch nicht mehr wirklich durchsehen, was wo wie benutzt wird.

Ich kann es nicht 100%ig sagen, aber ich vermute, dass Spring selbst schon die DataSource benutzt die du da konfiguriert hast (Tipp: besser SimpleDriverDataSource benutzen). Der JBoss wertet die persistence.xml vermutlich ein zweites Mal aus, deswegen der Lookup.

Zu den Bibliotheken: Ich habe die im Maven-Repository vorhandenen Versionen benutzt. Da wo's keine 2.5.5 gab, habe ich die entsprechend letzte (2.5.3) genommen.....
Im zentralen Maven Repo (http://repo1.maven.org/maven2) sind alle Springbibliotheken in Version 2.5.5 vorhanden: z.B. http://repo1.maven.org/maven2/org/springframework/spring-beans/2.5.5/

REINHAUN!
 
Hallo Oliver,

danke, manchmal braucht man jemand, der einen mit der Nase draufdrückt, wenn man den Wald vor lauter Bäumen nicht mehr sieht. :)
Hab's jetzt verstanden, jetzt läuft's auch. Danke nochmal.

Übrigens: spring-beans kam in meiner pom.xml gar nicht vor. War wohl 'ne Abhängigkeit..
Ist aber auch gerade gezogen :)
 
Übrigens: spring-beans kam in meiner pom.xml gar nicht vor. War wohl 'ne Abhängigkeit..
Ist aber auch gerade gezogen :)

Jap, das passiert schnell, wenn man nicht aufpasst. Man bindet selbst nur 3 Spring Libs in Version X ein. Allerdings dann noch eine andere Lib, die andere Spring Libs in version X - 1 benötigt. Dann kommt man nicht umhin explizit die genaue Version anzugeben. Dumm, muss aber leider sein.

REINHAUN!
 

Neue Beiträge

Zurück