EJBのクライアントを作成していますが、実行しようとすると、次の例外が発生します。
javax.naming.NoInitialContextException
:環境またはシステムプロパティで、またはアプレットパラメータとして、またはアプリケーションリソースファイルでクラス名を指定する必要があります。
問題が何なのか理解できません。
javax.naming
パッケージはJNDI APIを構成します。実装ではなく単なるAPIであるため、使用するJNDIの実装を指定する必要があります。実装は通常、通信しようとしているサーバーに固有です。
実装を指定するには、Properties
を作成するときにInitialContext
オブジェクトを渡します。これらのプロパティは、使用する実装とサーバーの場所を指定します。デフォルトのInitialContext
コンストラクターは、システムプロパティが存在する場合にのみ役立ちますが、プロパティは手動で渡した場合と同じです。
どのプロパティを設定する必要があるかは、サーバーによって異なります。これらの設定を探して、プラグインする必要があります。
Jndi.propertiesを設定する必要があります。 activemqのプロパティの設定方法を説明するコードを以下に示します。そのように、アプリケーションに設定できます。 JBossのようなJ2EEコンテナ内では、これらのプロパティを設定する必要はありません。
Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.Apache.activemq.jndi.ActiveMQInitialContextFactory");
props.setProperty(Context.PROVIDER_URL,"tcp://localhost:61616");
InitialContext ctx = new InitialContext(props);
// get the initial context
// InitialContext ctx = new InitialContext();
QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
// create a queue connection
QueueConnection queueConn = connFactory.createQueueConnection();
queueConn.start();
// lookup the queue object
Queue queue = (Queue) ctx.lookup("dynamicQueues/Payment_Check");
私はこれが遅い答えであることを知っていますが、将来の参考のためだけに与えています。
次の名前/値のペアをハッシュテーブルに入れて、このコンストラクターを呼び出す必要があります。
public InitialContext(Hashtable<?,?> environment)
正確な値はアプリケーションサーバーに依存します。この例はjboss用です
jndi.Java.naming.provider.url=jnp://localhost:1099/
jndi.Java.naming.factory.url=org.jboss.naming:org.jnp.interfaces
jndi.Java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
JNDIの問題です。 InitialContext
クラスにJNDIサービスプロバイダーのデフォルトプロパティも明示的に設定されたサーバプロパティもない場合、その例外が表示されます。
をセットする Context.INITIAL_CONTEXT_FACTORY
環境プロパティを使用している初期コンテキスト実装のクラス名に。このクラスは、クラスパスでプログラムに使用可能でなければなりません。
小切手:
具体的には、SpringBootで組み込みTomcat7インスタンス内のデフォルト(引数なし)InitialContext
を取得しようとしたときにこの問題が発生しました。
私にとっての解決策は、TomcatにenableNaming
を伝えることでした。
つまり.
@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
return new TomcatEmbeddedServletContainerFactory() {
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
Tomcat tomcat) {
Tomcat.enableNaming();
return super.getTomcatEmbeddedServletContainer(Tomcat);
}
};
}
簡単で構成可能なソリューションは、jndi.propertiesファイルを1つ作成し、このファイルをクラスパスに配置することです。 jndi.propertiesは次のように作成できます
Java.naming.factory.initial = org.Apache.activemq.jndi.ActiveMQInitialContextFactory
# use the following property to configure the default connector
Java.naming.provider.url = vm://localhost
# use the following property to specify the JNDI name the connection factory
# should appear as.
#connectionFactoryNames = connectionFactory, queueConnectionFactory, topicConnectionFactry
# register some queues in JNDI using the form
# queue.[jndiName] = [physicalName]
queue.MyQueue = example.MyQueue
# register some topics in JNDI using the form
# topic.[jndiName] = [physicalName]
topic.MyTopic = example.MyTopic
ネーミングファクトリとURLを指定し、このファイルをクラスパスに配置するだけです。 JMSは必要な情報をそれ自体で取得し、将来的にも簡単に設定できます。
ほとんどの場合、これらの設定はjndi.properties
ファイル。あれはどこかにあるの?
次のJarライブラリをプロジェクトに追加して、同じ問題を解決しました。
フォルダから:C:\Program Files\glassfish-4.0\glassfish\lib
これらのライブラリへのリンクは壊れていて、Netbeansは使用する適切なクラスを見つけられませんでした。
クライアントプロジェクトでjboss-client.jarを使用し、ejbプロジェクトでjnp-client jarを使用する必要があります。
これに関する私の問題は、休止状態のセッションを作成していましたが、クラスパスの問題のためにデータベースインスタンスのJNDI設定が間違っていたことでした。ちなみに...
桟橋の命名と桟橋のプラスの依存関係が含まれていることを確認します(提供された範囲だけではありません)。これは私のためにそれを修正しました。
これを行う:
Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.Sun.enterprise.naming.SerialInitContextFactory");
Context initialContext = new InitialContext(props);
また、これをプロジェクトのライブラリに追加します。
C:\installs\glassfish\glassfish-4.1\glassfish\lib\gf-client.jar
それに応じてパスを調整する