因为EJB属于业务层,通常它要被客户端所调用
客户端类型可以是:J2SE J2EE J2ME
才用普通的JAVA类开发客户端:
新建 new一个Class 带有main()方法
客户端要调用EJB是要先通过JNDI去寻找EJB的承担对象
JNDI是用于访问命名目录的API,也是JAVA EE中的规范
这里编写的客户端程序完全可以部署在另外一台计算机上,只需要修改其中连接的服务器IP地址和启动JBOSS时绑定相应IP地址即可,这正事EJB的远程调用特性。
在37行返回的helloWorld实例对象并不是我们在服务器端编写的HelloworldBean,而是一个也实现了HelloWorld接口的代理对象,这个代理对象最终远程调用我们自己编写的HelloWorldBean,在第37行后加入了一行代码:System.out.println(helloWorld.getClass().getName()); 即可看到这个代理对象的类名
当EJB发布到JBOSS时,如果我们没有为它指定全局JNDI名称或修改过其默认EJB名称,JBOSS就会按照默认的命名规则为EJB生成全局JNDI名称,默认的命名规则如下:
把EJB应用打包成后缀为*.jar的模块文件,默认的全局JNDI名称是:
本地接口:EJB-CLASS-NAME/local
远程接口:EJB-CLASS-NAME/remote
EJB的接口实现类名(不加包名)
例:把HelloWorld应用打包成HelloWorld.jar文件,他的远程接口JNDI名称是:
HelloWorldBean/remote
把EJB作为模块打包进后缀名*.ear的JAVA EE企业应用文件,默认全局JNDI名称是:
本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local
远程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote
EAR-FILE-BASE-NAME为ear文件的名称,EJB-CLASS-NAME作为EJB的非限定类名
例:把HelloWorld应用打包成HelloWorld.ear的企业应用文件,他的远程接口JNDI名称是:
HelloWorld/HelloWorldBean/remote
----------------------------------------------------------------
通过属性文件,设置JNDI的上下文信息:
把硬编码的代码,放到配置文件中
Properties props = new Properties();
props.setProperty("java.naming.factory.initial"
,"org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
就可以注释掉了
在项目src下新建File 名称为:jndi.properties
内容:
java.naming.factory.initial = org.jnp.interfaces.NamingContextFactory
java.naming.provider.url = localhost:1099
保存,启动JBOSS后,运行客户端也可执行
在InitalContext cts = new InitalContext(); 时,其构造方法中默认从类路径下找jndi.properties文件
HelloWorld helloWorld = (HelloWorld)cts.lookup("HelloWorldBean/remote");
这句可能会报错,解决方案是:
查看EJB的JNDI
进入JBOSS的管理后台 http://localhost:8080/
点JMX Console,找到jboss,点service = JNDIView
这个服务提供了一个list()方法,点Invoke按钮,会列出JBOSS里面的资源
EJB部署后,生成的JNDI是在全局JNDI中(Global JNDI Namespace)
在其中找到EJB的JNDI名称,如果找到了则发布成功
也有可能是jar包出了问题,重新导jar包