当前位置: 首页 > 知识库问答 >
问题:

Glassfish 4通过独立应用程序访问EJB

方恺
2023-03-14

我试图通过JSE独立应用程序访问EJB。

在查找过程中找不到JNDI名称,这让我很苦恼。

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

“[glassfish 4.1][INFO][AS-EJB-00054][javax.enterprise.EJB.container][tid:_ThreadID=47 _ThreadName=admin listener(4)][timeMillis:1424811833554][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接口时,我得到的错误是什么?

这是Hello远程:

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.通信异常异常:SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory,java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl}[根异常java.rmi.远程异常: CORBANO_IMPLEMENT1398079489也许;嵌套异常是:org.omg.CORBA。NO_IMPLEMENT: ----------BEGIN服务器端堆栈跟踪---------- org.omg.CORBA。NO_IMPLEMENT:警告: 01000001:缺少本地值实现vmcid: SUN次要代码: 1已完成: 5月be:::造成原因:java.lang.ClassNotFound异常:br.com.pontews.EJB31_Generated__HelloBean__Intf____Bean(无安全管理器: RMI类加载器禁用)

谢啦

共有1个答案

施学
2023-03-14

用于lookup()的名称具有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)

第一步。在代码中使用no arg InitialContext()构造函数。

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

第二步。将远程EJB的全局JNDI名称传递给InitialContext。查找()

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

对于带3号的豆子。x远程业务接口:

Foo foo=(Foo)new初始上下文(). lookup("foEJB");

注意,在EJB3中。x案例查找的结果可以直接转换为远程业务接口类型,而无需使用PortableRemoteObject。狭窄的()。

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

Object homeObj=new InitialContext()。查找(“FooEJB”);

FooHome FooHome=(FooHome)PortableRemoteObject。狭窄(homobj,FooHome.class);

Foo Foo=Foo home。创建(…)第三步。包括适当的玻璃鱼。JAR位于java客户端的类路径中。

玻璃鱼3。

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

例如,假设应用程序类位于/home/user1/myclasses中,主客户端类是acme。我的客户:

java-classpath$GLASSFISH_HOME/GLASSFISH/lib/gf client。jar:/home/user1/myclasses-acme。我的客户

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

注:gf客户端。jar位于$GLASSFISH_HOME/modules/gf client中。玻璃鱼罐v3。

 类似资料:
  • 现在假设我们想要使用 Spark API 写一个独立的应用程序。我们将通过使用 Scala(用 SBT),Java(用 Maven) 和 Python 写一个简单的应用程序来学习。 我们用 Scala 创建一个非常简单的 Spark 应用程序。如此简单,事实上它的名字叫 SimpleApp.scala: /* SimpleApp.scala */ import org.apache.spark.S

  • 我正在使用Eclipse和Jboss开发EJB2.0项目。下面是代码示例: 09:33:50,273 INFO[org.jboss.as.ejb3.deployment.processors.ejbJNDIBindingsDeploymentUnitProcessor](MSC service thread 1-3)部署单元部署“ejbProject1.jar”中名为AdviceBean的会话be

  • 问题内容: 我正在考虑开发由两部分组成的桌面应用程序: 用户界面(例如Java应用) 后端Node.js服务器 2个部分通过插座连接。不要问为什么我知道这很奇怪。 我将希望能够为客户提供带有安装程序的应用程序。我不希望用户必须自己安装Node.js。 有没有一种方法可以独立安装Node.js服务器,即无需在系统上全局安装Node.js。 对于任何(Windows,Linux,Mac OS X …)

  • 我们有一个连接到outlook的独立Java应用程序。office365.com使用基本授权。这是一个简单的监控应用程序。 我被要求将其移动到“现代”授权,因此这似乎是在创建Azure应用程序以获取OAUTH2的访问令牌。我“认为”我已经正确地完成了所有设置,包括Microsoft graph API(委托) 电子邮件IMAP。访问服务器。所有offline\u访问SMTP。邮寄 因此,我从以下位

  • 我正在试图弄清楚如何构建一个Spring Boot独立应用程序。当然,要让东西自动连线需要一些初始的上下文起点。如果我只是尝试自动生成一个类来运行一个作业,那么即使我将它设置为静态,它也是空的。 有没有办法在一个独立的非Web应用程序中使用Spring@Services? 因此,首先将静态JobRunnerService连接到运行MyApplication的主程序,JobRunner(Servic

  • 问题内容: 我正在寻找在 独立的(桌面/秋千)* 应用程序中使用 Spring的 示例或教程,我进行了很多搜索,但找不到有用的东西,所有示例和教程均适用于Web应用程序,请告知。 * 问题答案: 使用maven创建独立应用程序,如下所示: 使用Maven创建独立的应用程序 将applicationContext放在类路径中,并按如下所示将其加载到主类中: 在此处查看全文: http://www.d