2017-07-31 24 views
1

我確定我在Spring Boot中使用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上下文。但問題是,如何提供上下文?

背景 我想爲SMTP的logback附加目的地配置javax.mail會議。 smtp appender能夠使用來自JNDI的郵件會話。見logback SMTPAppendersessionViaJNDI財產。

+0

爲什麼你需要JNDI?如果只是郵件使用Spring郵件抽象,那麼你不需要它。 –

回答

1

異常是因爲您尚未指定初始上下文工廠。

請看看這裏列出的一些提供商https://docs.oracle.com/cd/A97688_16/generic.903/a97690/jndi.htm#1005621

Spring有一個JndiRmiServiceExporter,它使RMI變得簡單,但我認爲選擇取決於你想要完成的工作。

+0

本文檔中列出的上下文工廠都是爲jee環境而製作的。在獨立的彈簧啓動應用程序中,它們沒有用(沒有RMI,沒有ApplicationClient)。另一個問題是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資源,那麼你使用的任何對象都必須是'Serializable'。從我可以告訴'javax.mail.Session'不是。 – ryan2049

+0

是的,太棒了!重要的部分是在嵌入式tomcat中啓用命名服務。感謝您指點我的例子!關於串行性我不明白爲什麼這應該是一個要求:沒有使用RMI,一切都在同一個過程中。至少郵件會話沒有問題。 – Gregor