0

見つけた例を使用して最初の EJB を開発しようとしていますが、次の間違いがあります。

Exception in thread "main" java.lang.IllegalStateException: No EJB receiver available for handling [appName:,modulename:HelloWorldSessionBean,distinctname:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@41408b80
at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:584)
at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:119)
at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:181)
at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:136)
at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:121)
at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:104)
at $Proxy0.sayHello(Unknown Source)
at com.ibytecode.client.EJBApplicationClient.main(EJBApplicationClient.java:16)

私は JBOSS 7.1 を使用しています。コードは次のとおりです。 HelloWorld.java パッケージ com.ibytecode.business;

import javax.ejb.Remote;

@Remote
public interface HelloWorld {

    public String sayHello();


}

HelloWorldBean.java パッケージ com.ibytecode.businesslogic;

import com.ibytecode.business.HelloWorld;
import javax.ejb.Stateless;

/**
 * Session Bean implementation class HelloWorldBean
 */
@Stateless
public class HelloWorldBean implements HelloWorld {

/**
 * Default constructor. 
 */
public HelloWorldBean() {
}

public String sayHello() {
    return "Hello World !!!";
}

}

EJBApplicationClient.java:

package com.ibytecode.client;

import javax.naming.Context;
import javax.naming.NamingException;

import com.ibytecode.business.HelloWorld;
import com.ibytecode.businesslogic.HelloWorldBean;
import com.ibytecode.clientutility.ClientUtility;

public class EJBApplicationClient {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    HelloWorld bean = doLookup();
    System.out.println(bean.sayHello()); // 4. Call business logic

}

 private static HelloWorld doLookup() {
        Context context = null;
        HelloWorld bean = null;
        try {
            // 1. Obtaining Context
            context = ClientUtility.getInitialContext();
            // 2. Generate JNDI Lookup name
            String lookupName = getLookupName();
            // 3. Lookup and cast
            bean = (HelloWorld) context.lookup(lookupName);

        } catch (NamingException e) {
            e.printStackTrace();
        }
        return bean;
    }


 private static String getLookupName() {
     /*
     The app name is the EAR name of the deployed EJB without .ear suffix.
     Since we haven't deployed the application as a .ear,
     the app name for us will be an empty string
     */
             String appName = "";

             /* The module name is the JAR name of the deployed EJB
             without the .jar suffix.
             */
             String moduleName = "HelloWorldSessionBean";

     /*AS7 allows each deployment to have an (optional) distinct name.
     This can be an empty string if distinct name is not specified.
     */
             String distinctName = "";

             // The EJB bean implementation class name
             String beanName = HelloWorldBean.class.getSimpleName();

             // Fully qualified remote interface name
             final String interfaceName = HelloWorld.class.getName();

             // Create a look up string name
             String name = "ejb:" + appName + "/" + moduleName + "/" +
                 distinctName    + "/" + beanName + "!" + interfaceName;

             return name;
         }


 }

ClientUtility.java パッケージ com.ibytecode.clientutility;

 import java.util.Properties;
 import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;

public class ClientUtility {

private static Context initialContext;

private static final String PKG_INTERFACES = "org.jboss.ejb.client.naming";

public static Context getInitialContext() throws NamingException {
    if (initialContext == null) {
        Properties properties = new Properties();
        properties.put("jboss.naming.client.ejb.context", true);
        properties.put(Context.URL_PKG_PREFIXES, PKG_INTERFACES);


        initialContext = new InitialContext(properties);
    }
    return initialContext;
}

}

プロパティファイル:

remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false

remote.connections=default

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

これは私が持っているものです。なぜ私はこれを持っているのですか?. 本当にありがとう。よろしく

4

1 に答える 1

0

以下を試してみましょう。かなり長くなってコメントに入力できません。

すべて問題ないようです。問題なくを離れることができます@Remote。また、EJB への正しいパスを取得していると仮定します。それを確認する方法は?

デプロイすると、サーバー コンソールに次のように表示されます。

ejb:{app-Name}/{module-Name}/{distinct-Name}/{bean-Name}!{fullPath-remote-Interface}

EG: 最初のものはあなたが興味を持っているものです ( lookupから)

java:global/MyBankLogicEAR/MyBankLogic/Account!main.IAccount
java:app/MyBankLogic/Account!main.IAccount
java:module/Account!main.IAccount
java:jboss/exported/MyBankLogicEAR/MyBankLogic/Account!main.IAccount
java:global/MyBankLogicEAR/MyBankLogic/Account
java:app/MyBankLogic/Account
java:module/Account

次の方法でルックアップを変更しようとします

final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");

try {
    final Context context = new InitialContext(jndiProperties);
    String appName = "";
    String moduleName = "jboss-firstbean";
    String distinctName = "";
    String beanName = "FirstBean";
    String interfaceFullName = "ejb.RemoteFirstBean";
    final String jndi = "ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName;
    RemoteFirstBean statelessRemote = (RemoteFirstBean)context.lookup(jndi);
} catch (NamingException ex) {
    System.out.println("problems");
}

これはAccessing remote EJB on JBoss AS 7.1 from web application から取得したものです。 jboss-ejb-client.properties ファイルで他のプロパティを設定する必要があるかどうかを理解するために、同じページの手順 5 を確認することもお勧めします。

于 2013-11-11T09:49:47.053 に答える