Spring - 无法转换javax.mail.session

时间:2012-01-11 15:19:51

标签: java spring tomcat javamail

我正在我的servlet上下文中创建一个邮件会话,然后使用JNDI将它注入我的spring框架设计中。以下是上下文的外观:

<Resource name="mail/session" auth="Container"
            type="javax.mail.Session"
            mail.smtp.from="noreply@xxxx.com"
            mail.smtp.user="noreply@xxxx.com"
            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 mail sender:

  <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
呃,什么????为什么要尝试转换呢?

3 个答案:

答案 0 :(得分:19)

如果类路径上有javax.mail.Session,则很可能有两个副本。一个可能来自appserver的内部库,另一个可能包含在应用程序的lib目录中。当您尝试使用它们时,这两个副本会发生冲突。

删除应用lib目录中的那个,然后重试。

答案 1 :(得分:3)

这是一个类加载问题。通常这是因为类在您的应用程序中的服务器 的jar中。在这种情况下,您可能希望将其从应用程序中删除。你的WEB-INF / lib或EAR中有 mail.jar 之类的内容吗?

答案 2 :(得分:0)

在我的情况下,有2个罐子- mail.jar和geronimo-javamail_1.4_mail-1.8.4.jar。

仅从应用程序的库中删除并将mail.jar放在服务器的库中之后,错误才得以解决。

如果不确定哪个其他jar可以提供此javax.mail.Session类,则可以使用以下命令进行查找。

forfiles /S /M *.jar /C "cmd /c jar -tvf @file | findstr /C:"Session" && echo @path"

会话是指我们正在搜索的课程会话