1

我是 Java 和 EJB 的新手。想创建一个简单的EJB。

所以我通过 Eclipse 创建了一个 EJB 项目(Eclipse Java EE IDE Juno Service Release 1 Build ID:20120920-0800)。然后我在那里添加了一个带有远程和本地接口的无状态会话 Bean。然后我添加了一个简单的方法,它只返回 2 个数字的总和。这是代码:

测试.java:

package ejb;

import javax.ejb.Stateless;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;

/**
 * Session Bean implementation class Test
 */
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class Test implements TestRemote, TestLocal {

/**
 * Default constructor. 
 */
public Test() {
    // TODO Auto-generated constructor stub
}

public int getSum(int a , int b) {
    return (a + b);
}

}

测试本地.java:

package ejb;

import javax.ejb.Local;

@Local
public interface TestLocal {
    public int getSum(int a , int b);
}

测试远程.java:

package ejb;

import javax.ejb.Remote;

@Remote
public interface TestRemote {
    public int getSum(int a , int b);
}

我右键单击我的 EJB 项目并将其导出为 JAR 文件。然后我将其部署到 GlassFish3 服务器: 1)应用程序 - 部署等;2) JNDI - 自定义资源。我已将资源类型设置为ejb.TestRemote,工厂类设置为org.glassfish.resources.custom.factory.EjbFactory。JNDI 名称为Test. 然后我编写了一个简单的客户端:

主.java:

import javax.naming.InitialContext;
import ejb.TestRemote;

public class Main {
    public static void main(String arg[]) {
        try {           
            TestRemote testR = (TestRemote) new InitialContext().lookup("Test");
            //System.out.println(new InitialContext().lookup("Test").toString());
            //.toString displays: Reference Class Name: ejb.TestRemote
            System.out.println(testR.getSum(50, 500));
        } catch(Exception e) {
            e.printStackTrace();
        }
    }   
}

我已将我gf-client-module.jarC:\glassfish3\glassfish\modulesEJB 项目的 JAR 文件添加到 Java 构建路径(项目属性)。

然后我尝试在 Eclipse 中启动我的客户端并立即出现以下消息:

com.sun.enterprise.v3.server.CommonClassLoaderServiceImpl findDerbyClient
INFO: Cannot find javadb client jar file, derby jdbc driver will not be available by default.

然后我收到下一条消息:

java.lang.ClassCastException: javax.naming.Reference cannot be cast to ejb.TestRemote
at Main.main(Main.java:16)

那么,任何人都可以帮我解决这个问题吗?...我真的很困惑:在引用上调用的 .toString 方法显示它是正确的 ejb.TestRemote 类引用,正如我之前提到的。但是......它不起作用((

有任何想法吗?提前致谢。

为我解决了,但有另一种方式

我已经失去了使用 Eclipse 并单独安装 GlassFish 的希望。因此,我在 Eclipse 中安装了 GlassFish 服务器,并在那里部署了我的 EJB 项目。它起作用了:现在我的客户工作正常。唯一的变化是 - 我应该为 .lookup: like 提供一个完整的包名.lookup("ejb.TestRemote")

感谢所有尝试/想要/希望提供帮助的人!

4

0 回答 0