使用 GlassFish 4 的 JNDI 独立应用程序的 EJB 3.1 问题

2024-01-07

我在独立测试应用程序的 JNDI 部分遇到问题。我有gf-client.jarjndi-properties.jar类路径上的文件。在运行客户端之前,我确保在 glassfish 服务器上部署了最新版本。

独立应用程序:

public class Main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws NamingException {
    Context context = new InitialContext();
    TestBeanRemote bean = (TestBeanRemote) context.lookup("java:global/server/TestBean");
    System.out.println(bean.sayHello("Sarah"));
}

}

EJB 3.1应用:

@Stateless(name = "java:global/server/TestBean")
public class TestBean implements TestBeanLocal, TestBeanRemote {

@Override
public String sayHello(String name) {
    return "Hello " + name + "!";
}
}

@Remote
public interface TestBeanRemote {

String sayHello(String name);
}

例外:

    Exception in thread "main" javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.impl.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.impl.SerialInitContextFactory]
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:674)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
    at javax.naming.InitialContext.init(InitialContext.java:244)
    at javax.naming.InitialContext.<init>(InitialContext.java:192)
    at com.gmail.physicistsarah.servertestclient.core.Main.main(Main.java:23)
Caused by: java.lang.ClassNotFoundException: com.sun.enterprise.naming.impl.SerialInitContextFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:340)
    at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:72)
    at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:61)
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:672)
    ... 4 more
    Java Result: 1

编辑:嗯,当声明初始上下文时,它实际上在第一行中断。我正在按照以下说明进行操作https://glassfish.java.net/javaee5/ejb/EJB_FAQ.html https://glassfish.java.net/javaee5/ejb/EJB_FAQ.html并且,根据它,调用构造函数时不需要参数InitialContext所以这种行为对我来说很神秘。我正在使用 NetBeans 8 ide 并且我有这些文件gf-client.jar and jndi-properties.jar使用项目/属性/库选项卡附加到项目。注意:这些 jar 仅附加到独立客户端。

EDIT2:我创建了一个新的客户端项目,在其属性中引用服务器项目,现在运行时出现新的异常:

  C:\Users\PC\Documents\NetBeansProjects\Server Client\nbproject\build-impl.xml:990: C:\Users\PC\GlassFish_Server\glassfish\domains\Server\generated\xml\Server Client does not exist.
at org.apache.tools.ant.types.AbstractFileSet.getDirectoryScanner(AbstractFileSet.java:484)
at org.apache.tools.ant.taskdefs.Copy.execute(Copy.java:487)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
at sun.reflect.GeneratedMethodAccessor197.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:435)
at org.apache.tools.ant.Target.performTasks(Target.java:456)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
at org.apache.tools.ant.Project.executeTarget(Project.java:1364)
at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
at org.apache.tools.ant.Project.executeTargets(Project.java:1248)
at org.apache.tools.ant.module.bridge.impl.BridgeImpl.run(BridgeImpl.java:286)
at org.apache.tools.ant.module.run.TargetExecutor.run(TargetExecutor.java:555)
at org.netbeans.core.execution.RunClassThread.run(RunClassThread.java:153)

设置是:服务器客户端项目引用服务器项目(运行上面相同的客户端代码)以及客户端调用运行时正在运行的服务器项目。

2014 年 12 月 6 日编辑: 尝试了教程,但我得到了:

Exception in thread "main" java.lang.RuntimeException: javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.impl.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.impl.SerialInitContextFactory]
at test.java.application.TestJavaApplication.main(TestJavaApplication.java:28)
Caused by: javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.impl.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.impl.SerialInitContextFactory]
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:674)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
at javax.naming.InitialContext.init(InitialContext.java:244)
at javax.naming.InitialContext.<init>(InitialContext.java:192)
at test.java.application.TestJavaApplication.main(TestJavaApplication.java:23)
Caused by: java.lang.ClassNotFoundException: com.sun.enterprise.naming.impl.SerialInitContextFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:340)
at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:72)
at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:61)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:672)
... 4 more
Java Result: 1

奇怪的是,它并不是说找不到名称或任何东西,而是说找不到某个类,我猜这是 JNDI 的一部分。严格按照指示进行操作。我将发布我使用的所有代码。我即将全新安装 NetBeans 和 GlassFish。 关联:https://www.dropbox.com/sh/cp6jho1bmhqczpw/AAAH7eWVwWJAxa99kg9DL-qJa https://www.dropbox.com/sh/cp6jho1bmhqczpw/AAAH7eWVwWJAxa99kg9DL-qJa


我在 Java EE 研讨会上使用 Netbeans 和 GlassFish 实现了一个类似的独立客户端,并使用了以下代码:

    InitialContext ctx = new InitialContext();
    GreetingBeanRemote ref = (GreetingBeanRemote) ctx.lookup("java:global/JWS2_JEE5_Server/JWS2_JEE5_Server-ejb/GreetingBean");
    String result = ref.greet("Hello");

请注意 JNDI 名称,它使用以下格式java:global/<app-name>/<module-name>/<bean-name>,这可能会帮助您使用正确的名称(如果这是问题所在)。在这方面要尝试的另一件事是使用mappedName属性 int@Stateless注释(例如@Stateless(mappedName="MySessionBean")),适用于 GlassFish。

关于您的异常,它表明命名本身不是问题,而更多的是您部署的类路径或工件。我在 Netbeans 中的设置如下:

  • 客户端项目,包含独立客户端
  • 服务器项目,包含 EJB 实现
  • Lib项目,包含EJB远程接口
  • 客户端项目正在引用 lib 项目
  • Lib 项目正在引用 javaee-api jar

也许这些信息有助于正确设置。


编辑2011年7月14日:

以下是有关如何使用 Netbeans 创建上述场景的分步教程 (8):

要求:安装了 GlassFish 4 的 Netbeans EE 版本 (8)、JDK 1.7 或更高版本

  1. 新项目/Java EE/企业应用程序:“MyEnterpriseApplication”,创建 EJB 模块、Java EE 6、GlassFish 4
  2. 新建项目/Java/Java类库:“MyJavaLibrary”
  3. 新项目/Java/Java 应用程序:“MyJavaApplication”
  4. 在 MyJavaApplication 中:属性/库/添加项目:MyJavaLibrary,从 GlassFish 安装 lib 文件夹中添加 JAR:gf-client.jar
  5. 在MyEnterpriseApplication-ejb中:新建SessionBean“HelloBean”,创建远程接口,选择项目MyJavaLibrary
  6. 在 MyJavaLibrary 中:编辑“HelloBeanRemote”,添加 [1]
  7. 在 MyEnterpriseApplication-ejb:edit "HelloBean" 中,添加 [2]
  8. 在MyJava应用程序中:编辑“MyJava应用程序”,在main中添加[3]
  9. 运行 MyEnterpriseApplication -> 在 GF 控制台输出中检查正确的部署
  10. 运行 MyJavaApplication -> 在控制台输出中看到成功的调用

[1]

String sayHello(String name);

[2]

@Override
public String sayHello(String name) {
   return "Hello " + name;
}

[3]

try {
    InitialContext context = new InitialContext();           
    HelloBeanRemote helloBean =
        (HelloBeanRemote) context.lookup("java:global/MyEnterpriseApplication/MyEnterpriseApplication-ejb/HelloBean");
    System.out.println(helloBean.sayHello("Geziefer"));
} catch (NamingException ex) {          
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 GlassFish 4 的 JNDI 独立应用程序的 EJB 3.1 问题 的相关文章

随机推荐

  • iTextSharp - 将 word doc/docx 转换为 pdf

    我知道 iTextSharp 可用于将文档转换为 pdf 但首先我们必须使用 iTextSharp text Document 从头开始 创建一个文档 然后向该文档添加元素 如果我有一个现有的 doc 文件 是否可以使用 iTextShar
  • 如何以编程方式获取 Apple Watch 唯一 id 或 UUID 或序列号?

    我想在 Apple Watch 中以编程方式读取任何唯一信息 例如 UDID 或序列号 有什么办法可以得到吗 我想以编程方式而不是通过 xcode 手动获取 WatchOS3没有任何UIDevice 类似 API 来获得平衡identifi
  • 如何根据分页查找id

    我正在使用jQuery 数据表插件 http www datatables net 在 JSF 上
  • Chrome 扩展“Script-src”错误(自学)[重复]

    这个问题在这里已经有答案了 我在学校学习 C 后正在自学 JavaScript 我认为尝试构建 Chrome 扩展将是一个很好的实践 我正在尝试访问 OpenWeatherMap 的 API 来获取城市 ID 来进行天气搜索 这是导致问题的
  • 方法重载和原始类型如何工作?

    我正在做 Java 课练习 我有这段代码 其中包含一个重载方法 class A Overloaded method public void f int n float x System out println f int n float x
  • 防止 ajax 调用缓存的正确方法是什么?

    我有一个 AJAX 调用 它根据简单的标准参数 例如一年中的月份 从不断变化的数据库返回值 在 IE 中 此函数返回缓存的数据 但它不应该返回 我已经监控了服务器端 并且客户端没有联系它 现在 我的标题问题已经以不同的方式被问过 已经在这里
  • 自动增加内部版本号

    我有两个项目正在解决 一个是版本 3 0 0 另一个是 2 0 0 我使用 MSBuild 脚本在 Team City 上构建我的解决方案 如何将版本字符串的内部版本号部分注入到 AssemblyVersion 属性中 同时保留开发时定义的
  • 如何分发调用Python的C++应用程序?

    我知道有一些方法可以从 C 调用 Python 例如 Python C API 或 Boost Python 我的问题是 如何分发该应用程序 例如 用户是否仍然需要在其计算机上安装 Python 和 Python 包 我的用户案例是 我想使
  • Azure函数应用部署和发布管道错误

    我使用 Visual Studio 推送了我的 net core 功能应用程序 现在正在设置发布管道 我可以很好地发布和执行该应用程序 并且它在 Azure 门户上运行得很好 但是 当我在 azure devOps 中看到版本的构建时 该插
  • 无状态 RESTful API 和第三方身份验证

    我想使用第 3 方身份验证 OpenID 也许是 OAuth 但我猜 OAuth 的用途是授权 以便用户可以轻松登录 但是 对每个请求进行身份验证是否意味着即使我不需要第三方 例如 Google 的任何东西 我也会多次调用它 例如 我使用
  • jquery如何调用外部url?

    我正在尝试使用 jquery 在 Facebook 墙上发表评论 但我的 ajax 调用不允许外部 url 谁能解释一下我们如何在 jquery 中使用外部 url 下面是我的代码 var fbUrl https graph faceboo
  • JavaScript 中双引号和单引号可以互换吗?

    考虑以下两种选择 console log double console log single 前者在字符串周围使用双引号 而后者在字符串周围使用单引号 我看到越来越多的 JavaScript 库在处理字符串时使用单引号 这两种用法可以互换吗
  • 如果行中的任何列满足条件而不是 mutate() 列

    使用 dplyr 我尝试使用 ifelse 和 mutate 有条件地更新列中的值 我想说的是 在一个数据框中 如果一行中的任何变量 列 等于7 那么变量c应该变成100 否则c保持不变 df lt data frame a c 1 2 3
  • Hayoo/Hoogle 不将单态/较少多态签名与多态签名匹配

    例如 我试图了解谷歌和雅虎不匹配是否有根本原因 b gt c gt b gt c gt b b gt c c to a b c gt a b c gt a b b c c 这恰好是类型Control Arrow http hackage h
  • 如何接受逗号分隔列表来为模型构建标签?

    由于我当前应用程序的灵活性有限 我正在关闭 acts as taggable on 相反 我从头开始构建我的标签作为他们自己的模型 但是 我已经错过了表单的 model tag list 方法 该方法会分割以逗号分隔的用户输入并创建单独的标
  • PHP DOMDocument:如何删除 div?

    这是我的代码 doc new DOMDocument doc gt loadHTML stripslashes sContent si le meta existe alors il y a un sondage if doc gt get
  • 在四开书名中使用参数

    我正在尝试创建一本参数化的四开本书籍 其中在 quarto yml 中设置的书名根据参数 名称 而变化 但我无法使其工作 我用r params name在标题中 但它总是将行内代码打印到标题中而不是输出中 下面是我的 quarto yml
  • 如何使用 SSRS 2005 将 INT 转换为 HH:mm:ss

    好的 我需要显示从 SQL 2005 作为 INT 进入 SRSS 2005 的代理的总通话时间 对于我的一生 我无法弄清楚我需要使用什么表达式编辑或格式编辑组合 对于详细部分 我可以使用 DATEADD s SUM Fields Talk
  • 如何在我的网站上打开 wss: 或 ws: 端口?

    我在用Ratchet lib socketo me作为我的聊天应用程序的网络套接字 当我输入 localhost 8080 时 它工作得很好 当我在线发布应用程序时 如何将我的网站设置为 wss 怎么打开端口什么的 这是连接代码 docum
  • 使用 GlassFish 4 的 JNDI 独立应用程序的 EJB 3.1 问题

    我在独立测试应用程序的 JNDI 部分遇到问题 我有gf client jar和jndi properties jar类路径上的文件 在运行客户端之前 我确保在 glassfish 服务器上部署了最新版本 独立应用程序 public cla