Spring JBoss 7 - wie JNDI Datasource einbinden

y0dA

Top Contributor
Hi,
aktuell wird bei uns im Projekt die dataSource wie folgt in der 'applicationContext.xml' definiert:
Java:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
      destroy-method="close"> 
    <property name="driverClass" value="${database.driverClassName}" />
    <property name="jdbcUrl" value="${database.url}" />
    <property name="user" value="${database.username}" />
    <property name="password" value="${database.password}" />
    <property name="minPoolSize" value="5" />
    <property name="maxPoolSize" value="50" />
    <property name="initialPoolSize" value="10" />
    <property name="checkoutTimeout" value="0" />
    <property name="maxStatements" value="50" />
    <property name="maxIdleTime" value="300" />
</bean>

Die Platzhalter bekommen die Werte von folgendem .properties File:
Code:
database.driverClassName=net.sourceforge.jtds.jdbc.Driver
database.url=jdbc:jtds:sqlserver://xxx:xxx/
database.username=username
database.password=pwd

Weitere, eventuell relevante, Stellen in der 'applicationContext.xml':
[XML]<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="xxxx" />
<property name="dataSource" ref="dataSource" />
<property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml"/>
<property name="jpaVendorAdapter">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform"
value="org.hibernate.dialect.SQLServerDialect" />
<property name="showSql" value="false" />
<property name="generateDdl" value="false" />
</bean>
</property>
</bean>

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

So nun hätte ich versucht die obige dataSource Definition durch folgende zu ersetzen (2 Varianten welche mir den gleichen Fehler liefern):
[XML]<jee:jndi-lookup id="dataSource" jndi-name="java:jboss/datasources/myDataSource"
expected-type="javax.sql.DataSource" resource-ref="false">
</jee:jndi-lookup>[/XML]

[XML] <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:jboss/datasources/wtb" />
</bean> [/XML]

Und so sieht die Exception im server.log aus:

Code:
Caused by: javax.resource.ResourceException: Wrong driver class [class org.h2.Driver] for 
this connection URL [jdbc:jtds:sqlserver://xxx:xxx]
at   
org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(
LocalManagedConnectionFactory.java:251)
... 68 more

Also simmt eine meiner beiden dataSource Definitionen? Wo muss ich die Driverclass definieren (bei der zu ersetzenden dataSource gibts ja hierfür extra ein Property 'driverClass')? Muss ich eventuell das Driver .jar irgendwo (am besten in ein /lib) am Server legen?
 
N

nillehammer

Gast
Der JDBC-Driver muss natürlich zur eingestzten Datenbank passen. Anhand der JDBC-URL erkennst du, welche es ist. Kenne mich mit JBOSS-Konfiguration nicht aus, aber in den von Dir gezeigten Dateien scheint es ja hier zu sein:
[XML]
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${database.driverClassName}" />
<property name="jdbcUrl" value="${database.url}" />
[/XML]
bzw in den Properties:
Code:
database.driverClassName=net.sourceforge.jtds.jdbc.Driver
database.url=jdbc:jtds:sqlserver://xxx:xxx/
Muss ich eventuell das Driver .jar irgendwo (am besten in ein /lib) am Server legen?
Ja, da die Connection zur DB vom App-Server gemanaged wird, braucht dieser auch das lib im Zugriff. Es reicht in diesem Fall nicht, das jar im ear/war zu deployen.
 

y0dA

Top Contributor
Der JDBC-Driver muss natürlich zur eingestzten Datenbank passen. Anhand der JDBC-URL erkennst du, welche es ist. Kenne mich mit JBOSS-Konfiguration nicht aus, aber in den von Dir gezeigten Dateien scheint es ja hier zu sein:
[XML]
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${database.driverClassName}" />
<property name="jdbcUrl" value="${database.url}" />
[/XML]
bzw in den Properties:
Code:
database.driverClassName=net.sourceforge.jtds.jdbc.Driver
database.url=jdbc:jtds:sqlserver://xxx:xxx/
Ja das ist mir schon klar nur wo und wie erstelle ich nun eine dataSource Bean mit driverClass und jndi?..


Sowohl JDBC-Driver und auch Connection müssen in der standalone.xml eingetragen werden. Der Driver muss als module "nachinstalliert" werden:

jboss-as-7-mysql-datasource-konfigurieren/

Natürlich läuft unsere Applikation in einem Cluster - somit gibts wohl nix in der standalone.xml zu tun? Finde leider auch keine Dokumentation oder ein ToDo..
 
Zuletzt bearbeitet:

JimPanse

Bekanntes Mitglied
Ja das ist mir schon klar nur wo und wie erstelle ich nun eine dataSource Bean mit driverClass und jndi?..




Natürlich läuft unsere Applikation in einem Cluster - somit gibts wohl nix in der standalone.xml zu tun? Finde leider auch keine Dokumentation oder ein ToDo..

natürlich erwähnt man sowas nicht bevor man die Frage stellt :pueh:...

Doku's gibt es reichlich. Der JBoss 7 läuft entweder im standalone oder im domain Modus (d.h. jboss/standalone/configration/standalone.xml oder jboss/domainconfigration/domain.xml).

Die Konfiguration bleibt die gleiche.

how_to_create_and_manage_datasources_in_as7

Edit standalone.xml/domain.xml adding a driver element into datasources subsystem

bzw.

Documentation
 

y0dA

Top Contributor
Ok, hab nun den Driver sowie die Datasource per web console am JBoss angelegt. Wie muss nun die korrekte Defintion in der applicationContext.xml aussehen?

Mit oben genannten Definitionen bekomme ich lustigerweise noch immer folgenden Fehler:

Code:
Caused by: javax.resource.ResourceException: Wrong driver class [class org.h2.Driver] for this connection URL [jdbc:jtds:sqlserver://xxxx:xxx/]
	at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(LocalManagedConnectionFactory.java:251)
	... 56 more

Obwohl ich beim erstellen der Datasource, per web console, den sqljdbc4.jar angegeben habe. Denk ich muss in der applicationContext.xml auch noch was zum Driver schreiben? Wo?
 
Zuletzt bearbeitet:

y0dA

Top Contributor
Ok hab nun auch dem 'default' profile des JBoss die Datasource hinzugefügt - nun bekomme ich eine andere Fehlermeldung (bin aber wohl mal über die Driversache hinweg):
Code:
14:03:11,964 ERROR [org.springframework.web.context.ContextLoader] (MSC service thread 1-2) Context initialization failed: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'StatisticsKPImonthly': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'TestFacade': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [spring/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/hibernate/cfg/BinderHelper
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:306) [spring-context-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) [spring-context-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) [spring-context-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:384) [spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283) [spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111) [spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:3392) [jbossweb-7.0.13.Final.jar:]
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:3850) [jbossweb-7.0.13.Final.jar:]
	at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:90) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
	at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
	at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [rt.jar:1.6.0_32]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [rt.jar:1.6.0_32]
	at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_32]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'MarketFacade': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [spring/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/hibernate/cfg/BinderHelper
	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:342) [spring-orm-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:442) [spring-context-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:416) [spring-context-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:549) [spring-context-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:150) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:303) [spring-context-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	... 21 more

aused by: java.lang.NoClassDefFoundError: org/hibernate/cfg/BinderHelper
	at org.hibernate.cfg.annotations.EntityBinder.bindEjb3Annotation(EntityBinder.java:175) [hibernate-core-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.cfg.annotations.EntityBinder.<init>(EntityBinder.java:149) [hibernate-core-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:543) [hibernate-core-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:4035) [hibernate-core-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3989) [hibernate-core-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1398) [hibernate-core-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1375) [hibernate-core-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1519) [hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193) [hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1100) [hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:689) [hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73) [hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final]
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:257) [spring-orm-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310) [spring-orm-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	... 48 more
Caused by: java.lang.ClassNotFoundException: org.hibernate.cfg.BinderHelper from [Module "deployment.my.war:main" from Service Module Loader]
	at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)
	at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468)
	at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456)
	at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:423)
	at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
	at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120)
	... 64 more
 

y0dA

Top Contributor
Gut zu wissen, das aktuelle Problem rührt aber eher daher dass ich 'sql4jdbc.jar' am JBoss deployed habe und meiner JNDI genannt habe aber eigentlich 'jdts-1.2.jar' benötige. Deshalb bekomme ich den Fehler dass die Connection URL nicht passt.

Natürlich gehts nun weiter, JBoss 7 unterstützt nur jdbc 4 compliant driver, deshalb funktionierte der 'sql4jdbc.jar', bei 'jdts-1.2.jar' siehts leider anders aus, den erkennt JBoss per Deploy nicht. Sprich nun muss ich mir anschauen wie ich den jdts als module einbinden kann.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S JBoss - .properties vom Kunden änderbar machen Application Tier 10
M org.jboss.weld.exceptions.UnproxyableResolutionException wegen Parametern im Superclass-Kontruktor Application Tier 10
G jBoss automatische Synchronisation? Application Tier 4
JimPanse JBoss 7 + JPA + Kundera + Cassandra Application Tier 2
B Glassfish vs. Tomcat/JBoss Application Tier 4
S Umstellung von JBoss 7 Full auf Web Profile Application Tier 4
V [JBoss 5] Datenbankverbindung zur Laufzeit aufbauen? Application Tier 8
V [JBoss5] JBoss stoppen bzw. am starten hindern? Application Tier 9
V [JBoss 5] Startroutine implementieren? Application Tier 7
S JBoss, EAR, EJB und ClassNotFound Application Tier 28
V JBoss 5 DeploymentSorter? Application Tier 3
V JBoss 5 mag @Service nicht Application Tier 2
K Threads im JBoss Application Tier 20
S JBoss EJB RMI Application Tier 5
A Jboss Ear mittels maven Application Tier 3
D Lazy Hibernate bei 3-Tier Applikation (JBoss + EJB3 + FatClient) Application Tier 6
ruutaiokwu stateful ejb unter jboss als webservice zur verfügung stellen... Application Tier 2
T Simples EJB-Beispiel für JBoss mit Eclipse Application Tier 3
M Spring - Leichtgewichtiger als JBoss? Application Tier 4
M JBoss Seam - Spring Application Tier 11
S Lookup failed for jndi EJB Application Tier 2
R Eigene Threads im Applictionserver und JNDI Application Tier 20
N jndi lookup() gibt null. Application Tier 2
K datasource Integration Application Tier 3

Ähnliche Java Themen

Neue Themen


Oben