Glassfish 4 Acessing EJB通过独立应用程序



我正试图通过JSE Standalone应用程序访问EJB。

查找过程中找不到JNDI名称,这让我很头疼。

经过一些没有任何解决方案的研究,我在部署后的Glassfish服务器日志中发现了一条消息,内容如下:

"[glassfish 4.1][INFO][AS-EJB-00054][javax.enterprise.exb.container][tid:_ThreadID=47_ThreadName=admin listener(4)][timeMillis:142481183554][levelValue:800][[EJB HelloBean的可移植JNDI名称:java:global/ponteWS/HelloBean!br.com.ponteWS.HelloRemote,java:global/ponteWS/HelloBean!br.com/ponteWS.HelloBean]]]"

我试过这个遥远的名字,瞧!!!它有效。

我尝试了另一个名字,但没有成功。

问题来了:

1-为什么JNDI名称如此奇怪????我能做些什么来避免在bean的名称前面出现包名称吗?2-当我直接访问bean而不是HelloRemote接口时,会出现什么错误?

这是HelloRemote:

package br.com.pontews;
import javax.ejb.Remote;
@Remote
public interface HelloRemote {
    public String sayHello(String name);
}

这是豆子:

package br.com.pontews;
import java.io.Serializable;
import javax.ejb.LocalBean;
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Stateless(name="HelloBean")
@LocalBean
@Remote
public class HelloBean implements HelloRemote, Serializable {
    /**
     * 
     */
    private static final long   serialVersionUID    = 1L;
    /**
     * Default constructor.
     */
    public HelloBean() {
    }
    public String sayHello(String name) {
        return "Hello," + name + ".!" ;
    }
}

以下是有效的调用:

Object lookup = 
ctx.lookup("java:global/ponteWS/HelloBean!br.com.pontews.HelloRemote");

以下是不起作用的调用:

Object lookup = 
ctx.lookup("java:global/ponteWS/HelloBean!br.com.pontews.HelloBean");

最后,我得到的错误,呼叫不起作用:

线程"main"中的异常javax.naming.CommunicationException:SerialContext的通信异常[myEnv={java.nameing.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory,java.nameion.factory.url.pkgs=com.sun.eenterprise.namening,java.nameing.factory.state=com.sun.cocorba.ee.impl.presentation.rmi.JNDIStateFactoryImpl}[根异常是java.rmi.RemoteException:CORBA NO_IMPLEMENT 1398079489也许;嵌套异常是:org.omg.ORBA.NO_IMPLEMENT:----------------开始服务器端堆栈跟踪----------org.omg.ORBA.NO_IMPLEMENT:警告:01000001:缺少本地值实现vmcid:SUN次要代码:1已完成:可能:::引起原因:java.lang.ClassNotFoundException:br.com.pontews.EJB31_Generated_HelloBean_Intf____Bean(没有安全管理器:禁用RMI类加载器)

感谢

用于查找()的名称具有EJB规范指定的格式。

在glassfish的情况下,还应该可以使用远程业务接口的完全限定名称来查找bean(https://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#SessionBeanGlobalJNDINameAssignment)。在你的情况下,这将是

br.com.pontews.HelloRemote

如果您在查找时仍有问题,此处的说明可能会有所帮助:(来自https://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#StandaloneRemoteEJB)

步骤1。在代码中使用无参数InitialContext()构造函数。

开发人员遇到的最常见问题是将特定的JNDI引导属性传递给InitialContext(args)。其他一些供应商要求执行此步骤,但GlassFish没有。相反,请使用无参数InitialContext()构造函数。

步骤2。将远程EJB的全局JNDI名称传递给InitialContext.lookup()

独立的java客户端无法访问组件命名环境(java:comp/env)或@EJB注释,因此它们必须显式使用全局JNDI名称来查找远程EJB。(有关如何将全局JNDI名称分配给EJB组件的更多信息,请参阅此处)假设远程EJB的全局JNDI名称为"FooEJB":

对于具有3.x远程业务接口的Beans:

Foo Foo=(Foo)new InitialContext().lookup("FooEJB");

请注意,在EJB 3.x的情况下,查找的结果可以直接转换为远程业务接口类型,而无需使用PortableRemoteObject.string().

对于EJB 2.1和更早版本的会话/实体bean:

Object homeObj=new InitialContext().lowlup("FooEJB");

FooHome FooHome=(FooHome)PortableRemoteObject.r窄(homeObj,FooHome.class);

Foo Foo=fooHome.create(…)步骤3。在java客户端的类路径中包含适当的GlassFish.jar。

对于GlassFish 3。

在客户端的类路径中包括$GLASSFISH_HOME/GLASSFISH/lib/gf-client.jar。

例如,假设应用程序类在/home/user1/myclasses中,并且主客户端类是acme。MyClient:

java-classpath$GLASSFISH_HOME/GLASSFISH/lib/gf client。jar:/HOME/user1/myclasses acme。MyClient

请注意,gf-client.jar自动包含JavaEE6neneneba API类,因此无需将javaee.jar显式添加到类路径中。gf-client.jar引用GlassFish安装目录中的许多其他.jar,因此最好从安装目录本身引用它,而不是将它(以及所有其他.jar)复制到另一个位置。

注意:gf-client.jar位于GLASSFISH v3中的$GLASSFISH_HOME/modules/gf-client.jar中。

最新更新