java - 没有可用于处理的 EJB 接收器

标签 java jakarta-ee jboss ejb jndi

我正在按照以下两个教程学习如何在 JBoss 上部署 EJB:

  1. TutorialsPoint
  2. JBoss docs

基本上我用这两个类在 Netbeans 中创建了一个名为“EjbComponent”的 EJB 项目:

LibrarySessionBeanRemote.java

package com.test.stateless;

import java.util.List;

public interface LibrarySessionBeanRemote {

void addBook(String bookName);

List getBooks();

}

LibrarySessionBean.java

package com.test.stateless;

import java.util.List;
import java.util.ArrayList;
import javax.ejb.Stateless;
import javax.ejb.Remote;

@Stateless
@Remote(LibrarySessionBeanRemote.class)
public class LibrarySessionBean implements LibrarySessionBeanRemote {

List<String> bookShelf;

public LibrarySessionBean(){
    bookShelf = new ArrayList<String>();
}

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

@Override
public List<String> getBooks(){
    return bookShelf;
}
}

然后我成功地将它们部署到 JBoss Server

21:16:13,566 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-7) JBAS015876: Starting deployment of "EjbComponent.jar" (runtime-name: "EjbComponent.jar")
21:16:13,582 INFO  [org.jboss.weld.deployer] (MSC service thread 1-5) JBAS016002: Processing weld deployment EjbComponent.jar
21:16:13,583 INFO  [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-5) JNDI bindings for session bean named LibrarySessionBean in deployment unit deployment "EjbComponent.jar" are as follows:

java:global/EjbComponent/LibrarySessionBean!com.test.stateless.LibrarySessionBeanRemote
java:app/EjbComponent/LibrarySessionBean!com.test.stateless.LibrarySessionBeanRemote
java:module/LibrarySessionBean!com.test.stateless.LibrarySessionBeanRemote
java:jboss/exported/EjbComponent/LibrarySessionBean!com.test.stateless.LibrarySessionBeanRemote
java:global/EjbComponent/LibrarySessionBean
java:app/EjbComponent/LibrarySessionBean
java:module/LibrarySessionBean

21:16:13,589 INFO  [org.jboss.weld.deployer] (MSC service thread 1-5) JBAS016005: Starting Services for CDI deployment: EjbComponent.jar
21:16:13,593 INFO  [org.jboss.weld.deployer] (MSC service thread 1-4) JBAS016008: Starting weld service for deployment EjbComponent.jar
21:16:13,735 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 1) JBAS015865: Replaced deployment "EjbComponent.jar" with deployment "EjbComponent.jar"

现在要使用这个 EJB,我通过在 Netbeans 中创建另一个名为“Test”的项目来创建一个独立的 Java 客户端,其中包含一个类:

EJBTester.java

package com.test.client;

import com.test.stateless.LibrarySessionBeanRemote;
import com.test.stateless.LibrarySessionBean;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Hashtable;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.security.Security;
import org.jboss.sasl.JBossSaslProvider;

public class EJBTester {

BufferedReader brConsoleReader = null;

{
    brConsoleReader = new BufferedReader(new InputStreamReader(System.in));
}

public static void main(String[] args) {
    EJBTester ejbTester = new EJBTester();
    ejbTester.testStatelessEjb();
}

private void showGUI(){
    System.out.println("*************************");
    System.out.println("Welcome to the Book Store");
    System.out.println("*************************");
    System.out.print("Options \n1. Add Book\n2. Exit \nEnter Choice:");
}

private void testStatelessEjb(){
    try{
        Hashtable jndiProperties = new Hashtable();
        jndiProperties.put("jboss.naming.client.ejb.context", true);
        jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
        final Context context = new InitialContext(jndiProperties);
        final String appName = "";
        final String moduleName = "EjbComponent";
        final String distinctName = "";
        final String beanName = LibrarySessionBean.class.getSimpleName();
        final String viewClassName = LibrarySessionBeanRemote.class.getName();
        final String lookupPath = "ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName;
        LibrarySessionBeanRemote libraryBean = (LibrarySessionBeanRemote)context.lookup(lookupPath);
        System.out.println(lookupPath);
        int choice = 0;
        while (choice != 2) {
            String bookName;
            showGUI();
            String strChoice = brConsoleReader.readLine();
            choice = Integer.parseInt(strChoice);
            if (choice == 1) {
               System.out.print("Enter book name: ");
               bookName = brConsoleReader.readLine();
               libraryBean.addBook(bookName);          
            } else if (choice == 2){
               break;
            }
        }
        List<String> booksList = libraryBean.getBooks();
        System.out.println("Book(s) entered so far: " + booksList.size());
        for(String book: booksList){
            System.out.println(book);
        }
        System.out.println("**********Using second lookup to get library statless object");
        LibrarySessionBeanRemote libraryBean1 = (LibrarySessionBeanRemote)context.lookup(lookupPath);
        booksList = libraryBean1.getBooks();
        System.out.println("Book(s) entered so far: " + booksList.size());
        for(String book: booksList){
            System.out.println(book);
        }
        context.close();
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        try{
            if(brConsoleReader != null)
                brConsoleReader.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}    
}

jboss-ejb-client.properties

endpoint.name=client-endpoint
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false

remote.connections=default

remote.connection.default.host=127.0.0.1
remote.connection.default.port=4447
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false

remote.connection.default.username=app1
remote.connection.default.password=pass123

当我尝试运行此应用程序时,出现以下错误:

run:
Jul 03, 2015 9:28:42 PM org.jboss.ejb.client.EJBClient <clinit>
INFO: JBoss EJB Client version 1.0.30.Final-redhat-1
ejb:/EjbComponent//LibrarySessionBean!com.test.stateless.LibrarySessionBeanRemote
*************************
Welcome to the Book Store
*************************
Options 
1. Add Book
2. Exit 
Enter Choice:1
Enter book name: abcd

java.lang.IllegalStateException: EJBCLIENT000025: No EJB receiver available for handling [appName:, moduleName:EjbComponent, distinctName:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@7aec35a
     at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:747)
     at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:116)
     at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:186)
     at org.jboss.ejb.client.EJBInvocationHandler.sendRequestWithPossibleRetries(EJBInvocationHandler.java:255)
     at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:200)
     at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:183)
     at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:146)
     at com.sun.proxy.$Proxy0.addBook(Unknown Source)
     at com.test.client.EJBTester.testStatelessEjb(EJBTester.java:58)
     at com.test.client.EJBTester.main(EJBTester.java:25)
 BUILD SUCCESSFUL (total time: 7 seconds)

谁能告诉我哪里出错了?我已经阅读了 stackoverflow 上列出相同问题的其他线程,并尝试了他们所有的解决方案,例如在我的代码中包含以下内容

jndiProperties.put("jboss.naming.client.ejb.context", true);
context.close();

但还是报错。

我的配置详情:

  • Netbeans IDE 8.0.2
  • JBoss EAP 6.4
  • Java 1.8.0_45
  • Ubuntu 14.04 64 位

最佳答案

我能够重现缺少 jboss-ejb-client.properties 文件的错误。确保将其正确放置在您的项目中。

为了解决我的问题,我将它放在:

java/src

希望对你有帮助

关于java - 没有可用于处理的 EJB 接收器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31210733/

相关文章:

java - 在 tomcat servlet 中使用 java 编辑 .txt 文件的问题

java - PreferencePage 或 FieldEditorPreferencePage

java - 将 Maps.difference(firstMap, secondMap) 转换为 Java 中的 Map

java - 将要通过字段注入(inject) (CDI) 初始化的测试字段

java - 服务 jboss.web.deployment.default-host./.realm 已经注册

java - 为什么不推荐使用 org.jboss.logging.Logger 的 Logger.isInfoEnabled?

linux - 是否可以在 Linux (Ubuntu 16.04.1 LTS) 上安装 JBoss Fuse 6.3?

java - 如何显示进度条?多线程java

java.net.URI.create 异常

java - 将java ee应用程序部署到8080以外的另一个端口