2017-07-31 13 views
1

SpringブートでJNDITemplateを使用すると予想していますが、オブジェクトをJNDIコンテキストにバインドしようとすると例外が発生します。SpringブートでJndiTemplateを初期化する方法

@Bean 
CommandLineRunner initJndi() { 
    return (args) -> { 
     Properties props = new Properties(); 
     props.put("mail.smtp.host", "mail.bla.com"); 
     ... 
     Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() { 
     }); 

     JndiTemplate template = new JndiTemplate(); 
     template.bind("Session", session); 
    }; 
} 

例外は次のとおりです。

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

テンプレートにはJNDIコンテキストがありません。しかし、問題は、文脈がどのように提供されるのかということです。

背景 私はlogbackのSMTPアペンダのためのjavax.mailセッションを設定します。 smtpアペンダは、JNDIのメールセッションを使用できます。 logback SMTPAppendersessionViaJNDIプロパティを参照してください。

+0

なぜJNDIが必要ですか?メール専用の場合は、Springメール抽象化を使用する必要はありません。 –

答えて

1

例外は、初期コンテキストファクトリを指定していないためです。

https://docs.oracle.com/cd/A97688_16/generic.903/a97690/jndi.htm#1005621に記載されているプロバイダーの一部をご覧ください。

春にはJndiRmiServiceExporterがあり、RMIを簡単にすることができますが、その選択は正確に何を達成しようとしているかによって異なります。

+0

このドキュメントに記載されているコンテキストファクトリは、すべてjeeコンテキスト用に作成されています。スタンドアロンのバネ起動アプリケーションでは、これらは有用ではありません(RMIなし、ApplicationClientなし)。もう1つの問題は、JNDITemplateがこのJNDIコンテキストについてどのように学習するかです。 – Gregor

+0

すべてが同じJVM内で実行されている場合は、spring-bootを使用してこれを行う必要があります。 (例:https://github.com/wilkinsona/spring-boot-sample-tomcat-jndi/blob/master/src/main/java/sample/tomcat/jndi/SampleTomcatJndiApplication.java)ホストしようとしている場合スタンドアロンのスプリングブートアプリケーションを持つJNDIリソースであれば、使用するオブジェクトはすべて「シリアライザブル」でなければなりません。私が 'javax.mail.Session'と言うことができるものからではありません。 – ryan2049

+0

はい、素晴らしいです!重要な部分は、埋め込み型のTomcatでネーミングサービスを有効にすることです。私にこの例を指摘してくれてありがとう!シリアライザビリティに関して、私はこれがなぜ必要なのか理解していません.RMIの使用はなく、すべてが同じプロセス内にあります。少なくとも、メールセッションに問題はなかった。 – Gregor

関連する問題