OVH Cloud OVH Cloud

Lookup d'une Datasource MySQL avec un EJB EntityBean sous jboss

1 réponse
Avatar
Antoine Onnen
Bonjour à tous,

Je peine depuis quelques jours à charger une datasource depuis mon EJB
EntityBean
la version de jboss est la 3.2.2 , MySQL 3.23.38
j'utilise mysql-connector-java-3.0.9-stable-bin.jar pour le driver jdbc

voici le code de mon datasource mysql-ds.xml

<datasources>
<local-tx-datasource>
<jndi-name>MySQLmydbDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/mydb</connection-url>
<driver-class>org.gjt.mm.mysql.Driver</driver-class>
<user-name>mylogin</user-name>
<password>mypass</password>
</local-tx-datasource>
</datasources>

La datasource est bien déployée apparemment dans Jboss, je vois les lignes
suivantes dans l'interface admin
http://localhost:8080/jmx-console

a.. name=MySQLmydbDS,service=LocalTxCM
a.. name=MySQLmydbDS,service=ManagedConnectionFactory
a.. name=MySQLmydbDS,service=ManagedConnectionPool


Mon EJB se deploie bien quand je le met dans mon repertoire deploy

Voici le morceau de code de l'EJB qui fait planter :

public void setEntityContext(EntityContext context) {
this.context = context;
try {
InitialContext ic = new InitialContext();
DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/ClientDB");
/* ----> plantage */
connexionBD = ds.getConnection();
}
catch (Exception e) {
throw new EJBException("Connexion à la base de données impossible : "
+ e.getMessage());
}
}

Voici le ejb-jar.xml

<ejb-jar>
<description>Descripteur de déploiement pour l'EJB client</description>
<display-name>EJB Client</display-name>
<enterprise-beans>
<entity>
<description>EJB Client ( BMP )</description>
<ejb-name>Client</ejb-name>
<home>com.foobar.ejbs.ClientHome</home>
<remote>com.foobar.ejbs.Client</remote>
<ejb-class>com.foobar.ejbs.ClientBean</ejb-class>
<persistence-type>Bean</persistence-type>
<prim-key-class>java.lang.String</prim-key-class>
<reentrant>False</reentrant>
<resource-ref>
<res-ref-name>jdbc/ClientDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</entity>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>Client</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>

Et enfin le jboss.xml

<jboss>
<enterprise-beans>
<entity>
<ejb-name>Client</ejb-name>
<jndi-name>ejb/Client</jndi-name>
<resource-ref>
<res-ref-name>jdbc/ClientDB</res-ref-name>
<jndi-name>MySQLmydbDS</jndi-name>
</resource-ref>
</entity>
</enterprise-beans>
</jboss>

Le message d'erreur au lancement du client :

java.rmi.ServerException : RemoteException occured in server Thread; nested
exception is :
java.rmi.ServerException: EJBException:; nested exception is :
javax.ejb.EJBException: Conexion à la base de donnée impossible : Could not
dereference object

1 réponse

Avatar
Antoine Onnen
J'ai la soluce
Ajouter le prefice dsn "java:/"

<jboss>
<enterprise-beans>
<entity>
<ejb-name>Client</ejb-name>
<jndi-name>ejb/Client</jndi-name>
<resource-ref>
<res-ref-name>jdbc/ClientDB</res-ref-name>
<jndi-name>java:/MySQLmydbDS</jndi-name> <!--Change is here-->
</resource-ref>
</entity>
</enterprise-beans>
</jboss>

Antoine