私は EJB の初心者で、デモンストレーション用に非常に小さな ejb コンポーネントを作成しました。すべきことは、「hello」を出力することだけです。現在、リモート クライアントの InitialContext を正しく構成するのに苦労しています。使用するコンテナは JBoss 7.0 です。私はejb3.2でJaveEE7.0を使用しています。
EJB のインターフェース:
package hello;
public interface Hello {
public String sayHello(String name);
}
Bean 自体:
package hello;
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Stateless(name="HelloEJB")
@Remote(Hello.class)
public class HelloBean implements Hello {
@Override
public String sayHello(String name) {
return "Hello, " + name;
}
}
そして、EJB プロジェクト内に配置したリモート クライアントを Java アプリケーションとして実行します。
package client;
import hello.Hello;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
public class Test {
public static void main(String[] args) {
Hello statelessHello = null;
try {
statelessHello = lookupStatelessHello(); // the method that throws exception
} catch (NamingException e) {
System.out.println("Bean Loading Failed");
e.printStackTrace();
Thread.currentThread().stop();
}
Hello stub=(Hello)PortableRemoteObject.narrow(statelessHello, Hello.class);
System.out.println("obtained a remote stateless hello for invocation");
System.out.println(stub.sayHello(args[0]));
}
private static Hello lookupStatelessHello() throws NamingException {
// the problematic code:
Properties jndiProperties = new Properties();
jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
jndiProperties.put(Context.PROVIDER_URL,"remote://localhost:4447"); // tried to change ports.
jndiProperties.put("jboss.naming.client.ejb.context", true);
Context context = new InitialContext(jndiProperties); // exception happens here
return (Hello) context.lookup("stateless1/HelloEJB!hello.Hello");
}
}
JBoss を実行すると、ejb プロジェクトを問題なくデプロイできます。
13:37:20,141 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC サービス スレッド 1-6) デプロイメント ユニット デプロイメント「stateless1.jar」の HelloEJB という名前のセッション Bean の JNDI バインディングは次のとおりです。
java:global/stateless1/HelloEJB!hello.Hello java:app/stateless1/HelloEJB!hello.Hello java:module/HelloEJB!hello.Hello
java:global/stateless1/HelloEJB java:app/stateless1/HelloEJB
java:module/HelloEJB13:37:20,255 INFO [org.jboss.as.server.controller] (DeploymentScanner-threads - 2) デプロイされた「stateless1.jar」
しかし、リモート クライアントから ejb を呼び出そうとすると、次のようになります。
Bean の読み込みに失敗しました javax.naming.NoInitialContextException: クラスをインスタンス化できません: org.jboss.naming.remote.client.InitialContextFactory [ルート例外は java.lang.ClassNotFoundException: org.jboss.naming.remote.client.InitialContextFactory] で javax.naming .spi.NamingManager.getInitialContext (不明なソース) で javax.naming.InitialContext.getDefaultInitCtx (不明なソース) で javax.naming.InitialContext.init (不明なソース) で javax.naming.InitialContext.(不明なソース) で client.Test. client.Test.main(Test.java:18) で lookupStatelessHello(Test.java:34) 原因: java.lang.ClassNotFoundException: org.jboss.naming.remote.client.InitialContextFactory at java.net.URLClassLoader.findClass( java.lang.ClassLoader.loadClass(不明なソース) で sun.misc.Launcher$AppClassLoader で。java.lang.ClassLoader.loadClass(不明なソース) の loadClass(不明なソース) java.lang.Class.forName0(ネイティブ メソッド)
ポートを変更しようとしたり、セキュリティ資格情報を追加しようとしたりしましたが、ユーザーを追加する方法を理解できませんでした。また、Bean を検索する方法が間違っていることは確かですが、今のところ問題ではありません。
ここで私が間違っていることを見つけるのを手伝ってくれることを願っています。セットアップに関する詳細情報が必要な場合は、お問い合わせください。