2013-09-04 9 views
0

J'ai le projet suivant:classe [com.mysql.jdbc.Driver] pas trouvé

enter image description here

Le fichier model.Clienti est une "entité JPA", main.Main est un POJO avec une méthode principale et c'est le client pour le fichier model.Clienti. main.Main a le code suivant:

package main; 


import java.util.List; 
import javax.persistence.EntityManager; 
import javax.persistence.Persistence; 
import model.Clienti; 

public class Main { 
    public static void main(String[] args) { 

     EntityManager entityManager = Persistence.createEntityManagerFactory("JPATestEJB").createEntityManager(); 
     List<Clienti> list = entityManager.createQuery("select c from Clienti c", Clienti.class).getResultList(); 

     for (Clienti clienti : list) { 
      System.out.println(clienti.getNume()); 
     } 
    } 

} 

Et cela fonctionne sans problèmes, en sortie exactement ce que j'ai dans la base de données.

enter image description here

So « localement » je peux utiliser le fichier JPA sans problème, mais lorsque je tente de créer un EJB et le client EJB pour faire la même chose que le fichier main.Main je reçois une erreur.

L'EJB est situé dans le pachet.EmployeeSession (l'interface)

package pachet; 

import javax.ejb.Remote; 

@Remote 
public interface EmployeeSession { 
    public String getEmplastname(Integer empno); 

    public String test(); 
} 

Et le EmployeeSessionBean

package pachet; 

import java.util.List; 

import javax.ejb.EJBException; 
import javax.ejb.Stateless; 
import javax.persistence.EntityManager; 
import javax.persistence.Persistence; 

import model.Clienti; 

@Stateless 
public class EmployeeSessionBean implements EmployeeSession { 

    public String getEmplastname(Integer empno) { 

     try { 
      EntityManager em = Persistence.createEntityManagerFactory("JPATestEJB").createEntityManager(); 

      List<Clienti> list = em.createQuery("select c from Clienti c", Clienti.class).getResultList(); 

      for (Clienti clienti : list) { 
       System.out.println(clienti.getNume()); 
      } 
     } catch (EJBException e) { 
      e.printStackTrace(); 
     } 
     return "a mers"; 
    } 

    public String test() { 
     return "works"; 
    } 


} 

Pour ce EJB j'ai créé un client autonome, dans un autre projet. enter image description here

Le client n'a qu'une seule classe, ce qui suit:

import javax.naming.InitialContext; 

import pachet.EmployeeSession; 

public class Main { 


    public static void main(String[] args) { 


     try { 
      InitialContext ic = new InitialContext(); 
      EmployeeSession thing = (EmployeeSession) ic.lookup("pachet.EmployeeSession"); 
      System.out.println(thing.test()); 
      System.out.println("It seems it runs: " + thing.getEmplastname(1)); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

Pourtant, lorsque je tente de lancer le principal (celui-ci à partir du package par défaut) Je reçois la sortie suivante enter image description here

Comme on peut le voir il n'y a aucun problème à se connecter à l'EJB depuis le thing.test(); ce qui retourne "fonctionne" définitivement, il n'y a pas de problème concernant les bibliothèques requises pour le client je pense, mais après cela une exception se produit.

enter image description here

La poursuite comme on peut le voir EclipseLink ne trouve pas com.mysql.jdbc.Driver. Donc la question est: comment peut-il être possible que la main.Main dans le projet EJB fonctionne correctement et afficher les informations de la base de données, mais Main du client ejb ne fonctionne pas.

Plus précisément, le problème est dans l'EJB EmployeeSessionBean, si elle avait la structure suivante:

package pachet; 

import java.util.List; 

import javax.ejb.EJBException; 
import javax.ejb.Stateless; 
import javax.persistence.EntityManager; 
import javax.persistence.Persistence; 

import model.Clienti; 

@Stateless 
public class EmployeeSessionBean implements EmployeeSession { 

    public String getEmplastname(Integer empno) { 

     try { 
      String b = "nothing"; 
     } catch (EJBException e) { 
      e.printStackTrace(); 
     } 
     return "a mers"; 
    } 

    public String test() { 
     return "works"; 
    } 

a la sortie suivante: (notez que j'ai supprimé tout le code JPA 'd'affaires') enter image description here }

et on peut voir que les deux méthodes invoquées du client ont fonctionné. Cela signifie que le problème est dû au fait que le ejb EmployeeSessionBean ne peut pas utiliser le JPA de la même manière que le fichier main.Main, mais la question est pourquoi? Ils sont définitivement dans le même projet et on peut voir que j'ai les bibliothèques requises EclipseLink et mysql-jdbc.

Si l'un d'entre eux se serait trompé alors main.Main ne pourrait pas se connecter aussi, non? ' Merci pour le temps.

Voici un aperçu de mon fichier persistence.xml même si cela semble fonctionner. http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd ">

<class>model.Clienti</class> 
    <properties> 
     <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/comenzi"/> 
     <property name="javax.persistence.jdbc.user" value="root"/> 
     <property name="javax.persistence.jdbc.password" value=""/> 
     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
    </properties> 

</persistence-unit> 

Répondre

1

Vous devez avoir le pot MySQL déployé sur votre serveur Glassfish. Soit le déploiement avec votre application, ou le mettre dans le répertoire APPLIB sur le serveur.

Normalement, dans Glassfish un DataSource du serveur sera utilisé à la place de JDBC directement, de sorte que vous pouvez essayer aussi.

+0

J'ai fait un complètement nouveau projet, cette fois avec un DataSource et le pot mysql sur le serveur pas sur l'application comme je le voulais et cela fonctionne. Qui sait ce qui aurait pu causer le problème ... Merci pour le temps! – erasmus77

Questions connexes