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

EJB客户端上下文选择器可能不会更改

钱黎明
2023-03-14

我试图从嵌入式jetty服务器中运行的代码访问jbossAS7.1中公开的ejb:

final Properties jndiProperties = new Properties();
jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
jndiProperties.put(Context.PROVIDER_URL, "remote://127.0.0.1:4447");
jndiProperties.put("jboss.naming.client.ejb.context", true);
jndiProperties.put("jboss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT", "false");
jndiProperties.put(Context.SECURITY_PRINCIPAL, "ubiant");
jndiProperties.put(Context.SECURITY_CREDENTIALS, "ubiant2iA");
ctx = new InitialContext(jndiProperties);

Object b = ctx.lookup("ejb:Hemis/HemisCoreClient//" + "HardwareDataManagement" + "!" + "com.ubiant.hemis.client.ejb.interf.I_HardwareDataManagement");

但我得到了一个例外:“EJB客户端上下文选择器可能不会更改”

谁能帮我一下吗?

这里是完整的stacktraces:

11: 17:43003错误[stderr](qtp10117087-119)javax。命名。NamingException:未能创建远程连接[根异常为java.lang.RuntimeException:未能设置EJB远程上下文]

11:17:43,011错误[stderr](qtp10117087-119)org.jboss.naming.remote.client.ClientUtil.naming异常(ClientUtil.java:36)

11: 17:43011组织错误[标准](qtp10117087-119)。jboss。命名。遥远的客户InitialContextFactory。getInitialContext(InitialContextFactory.java:121)

11: 17:43012 javax上的错误[stderr](qtp10117087-119)。命名。spi。NamingManager。getInitialContext(NamingManager.java:684)

11: 17:43012 javax上的错误[stderr](qtp10117087-119)。命名。InitialContext。getDefaultInitCtx(InitialContext.java:307)

11:17:43,012ERROR[stderr](qtp10117087-119)在javax.naming.初始Context.init(初始Context.java:242)

11:17:43,012ERROR[stderr](qtp10117087-119)javax.naming.初始化上下文。(初始化ontext.java:216)

11: 17:43012身份验证时出错[标准](qtp10117087-119)。TokenAuthentificationBroker。addConnection(TokenAuthentificationBroker.java:86)

11: 17:43012组织错误[标准](qtp10117087-119)。阿帕奇。activemq。经纪人可变BrokerFilter。addConnection(MutableBrokerFilter.java:97)

11:17:43,012错误[stderr](qtp10117087-119)org.apache.activemq.broker.TransportConnection.processAddConnection(TransportConnection.java:733)

11: 17:43012组织错误[标准](qtp10117087-119)。阿帕奇。activemq。经纪人jmx。ManagedTransportConnection。processAddConnection(ManagedTransportConnection.java:79)

11: 17:43012组织错误[标准](qtp10117087-119)。阿帕奇。activemq。命令ConnectionInfo。访问(ConnectionInfo.java:139)

11:17:43,012错误[stderr](qtp10117087-119)org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:292)

11: 17:43012组织错误[标准](qtp10117087-119)。阿帕奇。activemq。经纪人TransportConnection 1美元。onCommand(TransportConnection.java:149)

11: 17:43012组织错误[标准](qtp10117087-119)。阿帕奇。activemq。运输运输支持。doConsume(TransportSupport.java:83)

11: 17:43012组织错误[标准](qtp10117087-119)。阿帕奇。activemq。运输ws。MQTTSocket。sendToActiveMQ(MQTTSocket.java:112)

11: 17:43012组织错误[标准](qtp10117087-119)。阿帕奇。activemq。运输mqtt。MQTTProtocolConverter。sendToActiveMQ(MQTTProtocolConverter.java:133)

11: 17:43012组织错误[标准](qtp10117087-119)。阿帕奇。activemq。运输mqtt。MQTTProtocolConverter。onMQTTConnect(MQTTProtocolConverter.java:235)

11: 17:43012组织错误[标准](qtp10117087-119)。阿帕奇。activemq。运输mqtt。MQTTProtocolConverter。onMQTTCommand(MQTTProtocolConverter.java:157)

11:17:43,012错误[stderr](qtp10117087-119)org.apache.activemq.transport.ws.MQTTSocket.on消息(MQTTSocket.java:59)

11: 17:43012组织错误[标准](qtp10117087-119)。日食码头。websocket。WebSocketConnectionRFC6455$WSFrameHandler。onFrame(WebSocketConnectionRFC6455.java:860)

11: 17:43012组织错误[标准](qtp10117087-119)。日食码头。websocket。WebSocketParserRFC6455。parseNext(WebSocketParserRFC6455.java:349)

11: 17:43012组织错误[标准](qtp10117087-119)。日食码头。websocket。WebSocketConnectionRFC6455。句柄(WebSocketConnectionRFC6455.java:225)

11: 17:43012组织错误[标准](qtp10117087-119)。日食码头。io。nio。选择ChannelEndpoint。句柄(SelectChannelEndPoint.java:628)

11: 17:43012组织错误[标准](qtp10117087-119)。日食码头。io。nio。选择ChannelEndpoint$1。运行(选择ChannelEndpoint.java:52)

11: 17:43012组织错误[标准](qtp10117087-119)。日食码头。util。线QueuedThreadPool。runJob(QueuedThreadPool.java:608)

11: 17:43012组织错误[标准](qtp10117087-119)。日食码头。util。线QueuedThreadPool$3。运行(QueuedThreadPool.java:543)

11:17:43,012ERROR[stderr](qtp10117087-119)java.lang.Thread.run(Thread.java:745)

11: 17:43012错误[标准](qtp10117087-119)由:java引起。lang.RuntimeException:无法设置EJB远程上下文

11: 17:43012组织错误[标准](qtp10117087-119)。jboss。命名。遥远的客户InitialContextFactory。setupEjbContext(InitialContextFactory.java:438)

11:17:43,012ERROR[stderr](qtp10117087-119)在org.jboss.naming.remote.client.的初始上下文actory.get初始上下文(初始上下文actory.java:115)

11:17:43,012错误[stderr](qtp10117087-119) ... 25更多

11: 17:43012错误[标准](qtp10117087-119)由:java引起。lang.reflect。InvocationTargetException

11: 17:43012太阳时出错[标准](qtp10117087-119)。反映NativeMethodAccessorImpl。invoke0(本机方法)

11:17:43,012错误[stderr](qtp10117087-119)sun.reflect.NativemetodAccessorImpl.invoke(NativemetodAccessorImpl.java:57)

11:17:43,028ERROR[stderr](qtp10117087-119)sun.reflect.委托方法访问mpl.invoke(委托方法访问mpl.java:43)

11:17:43,028ERROR[stderr](qtp10117087-119)java.lang.reflect.Method.invoke(Method.java:606)

11: 17:43028组织错误[标准](qtp10117087-119)。jboss。命名。遥远的客户InitialContextFactory。setupEjbContext(InitialContextFactory.java:420)

11: 17:43028错误[标准](qtp10117087-119)。。。还有26个

11:17:43,028ERROR[stderr](qtp10117087-119)原因:java.lang.安全异常:EJB客户端上下文选择器可能无法更改

11:17:43,028ERROR[stderr](qtp10117087-119)org.jboss.ejb.client.EJBClientContext.set选择器(EJBClientContext.java:181)

11: 17:43028组织错误[标准](qtp10117087-119)。jboss。命名。遥远的客户ejb。RemoteNamingEJBClient上下文选择器。setupSelector(RemoteNamingEjbClientContextSelector.java:18)

11:17:43,028错误[stderr](qtp10117087-119) ... 31更多

共有1个答案

韦睿
2023-03-14

根据https://developer.jboss.org/thread/273859,“Setting jboss.naming.client.ejb.context=true尝试创建一个ejb客户端上下文选择器,但它已经为jboss EAP 6实例创建了”,因此“如果客户端在[jboss]服务器内运行,则不可能像您这样更改ejb选择器”。该线程中的建议是在类似您的情况下使用作用域上下文特性(7.5.4。使用作用域EJB客户端上下文)。

顺便说一句,我在想另一种可能有效的方法是回到本地(非远程)查找,它依赖于您的代码最终在JBoss中运行的事实,就像您最初在第一个问题中尝试做的那样(在jboss中部署的rar中获取EJB对象)。但是https://developer.jboss.org/thread/273428说“您需要实现远程接口才能从不同的应用程序耳/jar中查找它”,所以我认为这不是一个可行的选择,并且您处理它的方式(进行远程调用)听起来是正确的方法。

编辑1,根据2017年6月23日的评论:

基于通过JNDI-EJB客户端API或远程命名项目https://docs.jboss.org/author/display/AS72/RemoteEJB调用的“远程可访问JNDI对象的先决条件”部分,EJB只有在满足两个条件时才会远程公开:

1)此类对象应绑定在java: jboss/导出/命名空间下。例如,java: jboss/导出/foo/bar

2) 绑定到java:jboss/exported/namespace的对象应该是可序列化的。这允许通过导线将对象发送到远程客户端

当我查看显示从您最初的问题中注册EJB的日志时,我没有看到任何迹象表明您尝试访问的EJB被绑定在java:jboss/exported/code>命名空间下。为了使远程查找能够工作,我认为除了使用作用域上下文之外,您还需要弄清楚如何在该名称空间下绑定EJB。

 类似资料:
  • There are many Ethereum clients to choose from. We recommend different clients depending on whether you are developing or deploying. 开发过程中 Ganache We recommend Ganache, a personal blockchain for Ether

  • 我知道很多人已经询问了这个错误,但我仍然找不到解决方案,我按照本教程创建了一个远程客户端,访问驻留在Wildfly 10服务器上的Bean,该服务器运行在地址:localhost:8082。这是我的代码: 我的界面: 我的Bean: 我的远程客户端: 然后我还在项目的src/文件夹中添加了一个jboss-ejb-client.properties文件,如下所示: 我的操作与教程完全相同,但仍然会出

  • 问题内容: 当Websphere调用@Startup EJB时,应在哪里设置用户上下文? 我有一个带有启动EJB的Java EE应用程序,并且我知道它在调用EJB时​​设置了一个用户,因为调用由于缺少角色而失败。但是,我找不到在哪里设置用户。 问题答案: EJB规范指出,会话Bean@PostConstruct方法是在未指定的安全上下文中调用的,而WebSphere并未记录特定的安全上下文或对其进

  • 我的环境是Java1.7、Eclipse Luna、Wildfly8.x、XDoclet1.2.3、Windows7。 我想使用XDoclet创建一个新的EJB2.1项目。 我去了Java EE透视图。 EJB模块2.1版本 EJBDoclet(XDoclet)1.2.3版本 Java 1.7版本 这就是“Project Facets”窗口的外观: 单击OK按钮关闭“Project Facets”

  • 本文向大家介绍Java下http下载文件客户端和上传文件客户端实例代码,包括了Java下http下载文件客户端和上传文件客户端实例代码的使用技巧和注意事项,需要的朋友参考一下 一、下载客户端代码 上述代码只适合下载小文件,如果下载大文件则会出现  Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 错误,所以

  • 问题内容: 根据EJB客户端应用程序上的Netbeans教程,我似乎无法调用该方法: 编译错误: 客户: ejb: 远程接口: 现在,如果接口被修改: Bean现在可以使用以下方法: 但是,有一个NPE: 如何正确调用该方法?EJB未实例化? 问题答案: 我从头开始。我能想到的唯一区别是,我没有创建EJB应用程序,而是为bean创建了EJB模块。否则,我认为是相同的。 结构体: 客户代码: 豆: