web-dev-qa-db-ja.com

NoInitialContextExceptionエラーの意味

EJBのクライアントを作成していますが、実行しようとすると、次の例外が発生します。

javax.naming.NoInitialContextException:環境またはシステムプロパティで、またはアプレットパラメータとして、またはアプリケーションリソースファイルでクラス名を指定する必要があります。

問題が何なのか理解できません。

58
Attilah

javax.namingパッケージはJNDI APIを構成します。実装ではなく単なるAPIであるため、使用するJNDIの実装を指定する必要があります。実装は通常、通信しようとしているサーバーに固有です。

実装を指定するには、Propertiesを作成するときにInitialContextオブジェクトを渡します。これらのプロパティは、使用する実装とサーバーの場所を指定します。デフォルトのInitialContextコンストラクターは、システムプロパティが存在する場合にのみ役立ちますが、プロパティは手動で渡した場合と同じです。

どのプロパティを設定する必要があるかは、サーバーによって異なります。これらの設定を探して、プラグインする必要があります。

33
skaffman

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");  

私はこれが遅い答えであることを知っていますが、将来の参考のためだけに与えています。

12
nichu09

次の名前/値のペアをハッシュテーブルに入れて、このコンストラクターを呼び出す必要があります。

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
11
stacker

JNDIの問題です。 InitialContextクラスにJNDIサービスプロバイダーのデフォルトプロパティも明示的に設定されたサーバプロパティもない場合、その例外が表示されます。

をセットする Context.INITIAL_CONTEXT_FACTORY環境プロパティを使用している初期コンテキスト実装のクラス名に。このクラスは、クラスパスでプログラムに使用可能でなければなりません。

小切手:

10
JuanZe

具体的には、SpringBootで組み込みTomcat7インスタンス内のデフォルト(引数なし)InitialContextを取得しようとしたときにこの問題が発生しました。

私にとっての解決策は、TomcatにenableNamingを伝えることでした。

つまり.

@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
    return new TomcatEmbeddedServletContainerFactory() {
        @Override
        protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
                Tomcat tomcat) {
            Tomcat.enableNaming();
            return super.getTomcatEmbeddedServletContainer(Tomcat);
        }
    };
}
6
Nick Grealy

簡単で構成可能なソリューションは、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は必要な情報をそれ自体で取得し、将来的にも簡単に設定できます。

4
Vaibhav Jain

ほとんどの場合、これらの設定はjndi.propertiesファイル。あれはどこかにあるの?

2

次のJarライブラリをプロジェクトに追加して、同じ問題を解決しました。

  • appserv-rt.jar
  • javaee.jar

フォルダから:C:\Program Files\glassfish-4.0\glassfish\lib

これらのライブラリへのリンクは壊れていて、Netbeansは使用する適切なクラスを見つけられませんでした。

2
Yannickv

クライアントプロジェクトでjboss-client.jarを使用し、ejbプロジェクトでjnp-client jarを使用する必要があります。

1
Sangram Badi

これに関する私の問題は、休止状態のセッションを作成していましたが、クラスパスの問題のためにデータベースインスタンスのJNDI設定が間違っていたことでした。ちなみに...

1
Thom

桟橋の命名と桟橋のプラスの依存関係が含まれていることを確認します(提供された範囲だけではありません)。これは私のためにそれを修正しました。

0
Neocy

これを行う:

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それに応じてパスを調整する

0
ACV