找不到类[com.mysql.jdbc.Driver]

时间:2013-09-04 14:10:01

标签: mysql java-ee jpa ejb client

我正在进行以下项目:

enter image description here

文件model.Clienti是一个" JPA Entity",main.Main是一个带有main方法的pojo,它是model.Clienti文件的客户端。 main.Main有以下代码:

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());
        }
    }

}

它可以毫无问题地工作,输出我在数据库中的确切内容。

enter image description here

所以&#39;本地&#39;我可以毫无问题地使用JPA文件,但是当我尝试创建EJB和EJB客户端来执行与main.Main文件相同的操作时,我收到错误。

EJB位于pachet.EmployeeSession(接口)

package pachet;

import javax.ejb.Remote;

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

    public String test();
}

和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";
    }


}

对于这个EJB,我在另一个项目中创建了一个独立的客户端。 enter image description here

客户只有一个类,如下:

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();
        }
    }

}

然而,当我尝试运行Main(这个来自Default包)时,我得到以下输出 enter image description here

可以看出,连接到EJB是没有问题的,因为thing.test();返回&#34;工作&#34; definetly运行,我认为客户端所需的库没有问题,但在此之后会出现异常。

enter image description here

延续,因为可以看到EclipseLink没有找到com.mysql.jdbc.Driver。

所以问题是:如何有可能EJB项目中的main.Main正确运行并显示来自db的信息,而来自ejb客户端的main不能。

更确切地说,问题出在EJB 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 {
           String b = "nothing"; 
        } catch (EJBException e) {
            e.printStackTrace();
        }
        return "a mers";
    }

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

有以下输出:(请注意,我删除了所有JPA&#39;业务代码) enter image description here     }

可以看出,从客户端调用的两个方法都有效。这意味着问题是因为ejb EmployeeSessionBean不能像使用main.Main文件那样使用JPA,但问题是为什么?他们确定在同一个项目中,可以看到我拥有所需的库EclipseLink和mysql-jdbc。

如果其中一个出错了那么main.Main也无法连接,对吧? &#39; 谢谢您的时间。

这里看看我的persistence.xml文件虽然它似乎工作正常。            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>

1 个答案:

答案 0 :(得分:1)

您需要将MySQL jar部署到Glassfish服务器。可以将其与您的应用程序一起部署,也可以将其放在服务器上的applib目录中。

通常在Glassfish中,将直接使用服务器DataSource而不是JDBC,因此您可能也想尝试使用它。