2012-01-11 61 views
7

我在我的servlet上下文中創建郵件會話,然後使用JNDI將其注入到我的Spring框架設計中。這裏的背景下的樣子:Spring - 無法轉換javax.mail.session

<Resource name="mail/session" auth="Container" 
      type="javax.mail.Session" 
      mail.smtp.from="[email protected]" 
      mail.smtp.user="[email protected]" 
      mail.smtp.auth="true" 
      mail.smtp.starttls.enable="true" 
/> 

而且在那裏我把它在:

<bean id="smtpSession" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="java:comp/env/mail/session"/> 
    </bean> 

,並在那裏我將其注入的Spring Java郵件發送者:

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
     <property name="host" ref="smtpHost"/> 
     <property name="password" ref="smtpPassword"/> 
     <property name="port" ref="smtpPort"/> 
     <property name="username" ref="smtpFrom"/> 
     <property name="session" ref="smtpSession"/> 
    </bean> 

這裏是我收到的信息:

Caused by: java.lang.IllegalStateException: Cannot convert value of type [javax. 
mail.Session] to required type [javax.mail.Session] for property 'session': no m 
atching editors or conversion strategy found 
     at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(Ty 
peConverterDelegate.java:231) 
     at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrap 
perImpl.java:447) 
     ... 51 more 

呃,什麼?它爲什麼試圖轉換它?

回答

17

如果您的類路徑中有javax.mail.Session,那麼您最有可能擁有兩個副本。一個可能來自應用程序服務器的內部庫,另一個可能打包在您的應用程序的lib目錄中。當你嘗試像這樣使用它們時,這兩個副本會發生衝突。

刪除應用lib目錄中的一個,然後重試。

+0

這正是它是什麼,但我不明白這將是一個問題。類加載器是否以某種方式分離實例,並比較內存中的地址? – Thom 2012-01-11 15:51:41

+1

@Thom:Java將兩個具有相同名稱但從不同類加載器加載爲不兼容的類處理。即使它們的定義是相同的,你也不能從一個到另一個。 – skaffman 2012-01-11 16:05:23

+0

這也解決了我的問題。我必須說這非常煩人,我正在尋找一個重複的'mail.jar',但是在使用工具並搜索'javax.mail.Session'後,我注意到Apache CXF依賴於Apache Geronimo,它擁有自己的JavaMail實現。 – g00glen00b 2014-05-19 06:23:53

3

這是一個類加載問題。通常這是因爲該類在您的應用程序中位於服務器中。在這種情況下,您可能希望將其從應用程序中刪除。你的WEB-INF/lib或EAR中是否有類似mail.jar

相關問題