我是Java和EJB的新手。想要创建一个简单的EJB。
所以我通过Eclipse创建了一个EJB项目(Eclipse Java EE IDE Juno Service Release 1 Build ID:20120920-0800)。然后我在那里添加了一个无状态会话Bean,其中包含远程和本地接口。然后我添加了一个简单的方法,只返回2个数字的总和。这是代码:
Test.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);
}
}
TestLocal.java:
package ejb;
import javax.ejb.Local;
@Local
public interface TestLocal {
public int getSum(int a , int b);
}
TestRemote.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
。然后我编写了一个简单的客户端:
Main.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.jar
中的C:\glassfish3\glassfish\modules
和我的EJB项目的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提供一个完整的包名:像.lookup("ejb.TestRemote")
。
感谢所有尝试/希望/希望提供帮助的人!