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

JNDI没有EJB接收器可用于处理

钦良弼
2023-03-14

我的EJBTest有问题。

我安装了WildFly并配置了用户管理和应用程序管理。

我编写了一个EJB 3.0并进行了部署:

@Stateless
@Remote(NewSessionBeanRemote.class)
public class NewSessionBean implements NewSessionBeanRemote {

    List<String> bookShielf;

    /**
     * Default constructor. 
     */
    public NewSessionBean() {
        bookShielf = new ArrayList<String>();
    }

    @Override
    public void addBook(String bookName) {
        bookShielf.add(bookName);
    }

    @Override
    public List getBook() {
        return bookShielf;
    }
}

之后,我编写了一个简单的客户端来连接它:

private static void invokeStatelessBean() throws NamingException {
    // Let's lookup the remote stateless calculator
    NewSessionBeanRemote remoteEjb = lookupRemoteSessionBean();
    System.out.println("Obtained a remote stateless calculator for invocation");
    String bookName = "TEST book";
    remoteEjb.addBook(bookName);
}

private static NewSessionBeanRemote lookupRemoteSessionBean() throws NamingException {

    final Hashtable jndiProperties = new Hashtable();
    jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
    jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
    jndiProperties.put(Context.PROVIDER_URL, "http-remoting://127.0.0.1:10090");
    jndiProperties.put(Context.SECURITY_PRINCIPAL, "ejb"); //this is the application user name, not management! it's correct?
    jndiProperties.put(Context.SECURITY_CREDENTIALS, "ejb");//this is the application password, not management! it's correct?
    jndiProperties.put("jboss.naming.client.ejb.context", true);
    final Context context = new InitialContext(jndiProperties);
    final String appName = "";
    final String moduleName = "EjbComponent";
    final String distinctName = "";
    final String beanName = NewSessionBean.class.getSimpleName();
    final String viewClassName = NewSessionBeanRemote.class.getName();
    System.out.println("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);
    return (NewSessionBeanRemote) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);
}

用户名和密码都是应用程序用户凭据,而不是管理!对吗?

我收到以下错误:

线程“main”java中出现异常。lang.IllegalStateException:EJBClient00025:没有可用于处理调用上下文组织的[appName:,moduleName:EjbComponent,distinctName:]组合的EJB接收器。jboss。ejb。客户EJBClientInvocationContext@5034c75a位于组织。jboss。ejb。客户EJBClientContext。requireEJBReceiver(EJBClientContext.java:798)位于org。jboss。ejb。客户接收器拦截器。handleInvocation(ReceiverInterceptor.java:128)位于org。jboss。ejb。客户EJBClientInvocationContext。组织上的sendRequest(EJBClientInvocationContext.java:186)。jboss。ejb。客户EJBInvocationHandler。位于组织的sendRequestWithPossibleRetries(EJBInvocationHandler.java:255)。jboss。ejb。客户EJBInvocationHandler。doInvoke(EJBInvocationHandler.java:200)位于org。jboss。ejb。客户EJBInvocationHandler。doInvoke(EJBInvocationHandler.java:183)位于org。jboss。ejb。客户EJBInvocationHandler。在com上调用(EJBInvocationHandler.java:146)。太阳代理$代理2.com上的addBook(未知源)。演播室Java语言客户EjbTester。com上的invokeStatelessBean(EjbTester.java:34)。演播室Java语言客户EjbTester。main(EjbTester.java:21)

我不知道为什么!有人有主意吗?

共有1个答案

慎星纬
2023-03-14

您收到上述错误是因为您试图使用绝对JNDI名称访问远程EJB。

如留档所述:

http远程客户端假定远程查找中的JNDI名称相对于java:jboss/exported命名空间,则绝对JNDI名称的查找将失败。

因此,在WildFly上部署应用程序后,您应该在服务器控制台上看到如下内容:

JNDI bindings for session bean named NewSessionBean in deployment unit deployment <your_deployment_unit> are as follows:

    java:global[/<application_name>]/<module_name>/<ejb_name>[!<interface_name>]
    java:app[/<module_name>]/<ejb_name>[!<interface_name>]
    java:module/<ejb_name>[!<interface_name>]
    java:jboss/exported[/<application_name>]/<module_name>/<ejb_name>[!<interface_name>]
    java:global/[/<application_name>]/<module_name>/<ejb_name>
    java:app[/<module_name>]/<ejb_name>
    java:module/<ejb_name>

因此,考虑到java: jboss/导出上下文,获得EJB的正确方法应该是:

// Normally the appName is the EAR name
// Leave it empty if your application isn't packaged in a EAR
String appName = "your_application_name/";
// The EJB module name
String moduleName = "ejb_module_name/";
String beanName = NewSessionBean.class.getSimpleName();
String viewClassName = NewSessionBeanRemote.class.getName();

(NewSessionBeanRemote) context.lookup(appName + moduleName + beanName + "!" + viewClassName);

为了进一步阅读,我建议您还查看JavaEE JNDI语法以及WildFly的JNDI参考。

关于您的凭据,它们不是必需的,因为您的EJB不需要任何类型的身份验证即可访问它。通常,这仅在您拥有例如使用LDAP服务提供程序的应用程序时才是必要的。

 类似资料:
  • 我是JBoss 7的新手。我面临着奇怪的行为。有时,当我试图调用会话bean时,会遇到以下异常: 这通常发生在从Eclipse运行GWT应用程序时。异常并不总是发生。有时它比其他情况发生得少。有时每次我调用会话bean时都会发生这种情况,这很痛苦。我阅读了教程(https://docs.jboss.org/author/display/AS71/EJB使用JNDI从远程客户端调用_sscc=t),

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

  • 我正在使用Spring Can Data Flow 1.7.2。发布并尝试关注这篇博文 创建一个“将处理器接收器组合到单个应用程序中:“一个新的接收器”。” 当我将代码作为博客的示例进行结构化时,我遇到了一些问题,我认为这是因为博客的示例使用了java。util。类似于处理器的函数。 我想我应该使用java。util。消费者,因为我正在尝试将现有接收器更改为处理器接收器混合 我的班级是这样的: 我

  • null MyBeanImpl.java client.java WEB-INF web.xml 我的本地接口: 我的web.xml 我的例外: 查找本身起作用。我得到一个推荐人。但当我想用(MyBeanInterface)进行强制转换时,却出现以下错误: 无法将“Class MyPackage.MyBeanInterface_WHJKP6_MyBeanImpl(由WebLogic.utils.C

  • 我正在尝试将连续触发器与 Spark 结构化流式处理查询结合使用。我得到的错误是,火花消费者在处理数据时找不到适当的偏移量。如果没有此触发器,查询将正常运行(如预期)。 我的工作: 从Kafka主题读取数据: 将数据写入Kafka主题: 所以我基本上没有做什么特别的事情——只是将输入数据传输到输出主题,而没有任何转换或无效操作。 我得到了什么: 在executor日志中,我看到很多这样的消息: 尽

  • 以前的尝试是让Netbean将EJB模块部署到Netbean可以访问的Glassfish服务器上,该模块以JAR而不是EAR的形式构建。但是,通过CLI使用将该JAR部署到Glassfish可能会遇到错误。 EAR通过CLI部署时没有问题--但是,EJB的JNDI名称似乎不起作用。差异是什么? 32.4.1.1可移植JNDI语法 三个JNDI名称空间用于可移植JNDI查找:java:global、