2012-01-11 19 views
7

Estoy creando una sesión de correo dentro de mi contexto de servlet y luego usando JNDI para inyectarlo en mi diseño de Spring Framework. Así es como se ve el contexto:Spring - no se puede convertir 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" 
/> 

Y dónde estoy trayendo en:

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

y donde yo estoy inyectarlo en el correo java primavera remitente:

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

Ahora aquí está el mensaje que recibo:

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 

Uh, ¿qué ??? ¿Por qué está tratando de convertirlo?

Respuesta

17

Es muy probable que tenga dos copias si javax.mail.Session en su classpath. Uno probablemente proviene de las bibliotecas internas del servidor de aplicaciones, el otro probablemente esté empaquetado en el directorio lib de su aplicación. Las dos copias chocarán cuando intentes y las uses así.

Elimine el que está en el directorio lib de su aplicación y vuelva a intentarlo.

+0

Eso es exactamente lo que era, pero no entendí que esto sería un problema. ¿Es que el cargador de clases separa las instancias de alguna manera y está comparando la dirección en la memoria? – Thom

+1

@Thom: Java trata dos clases con el mismo nombre pero cargadas desde diferentes cargadores de clases como incompatibles. No se puede transmitir de uno a otro, incluso si sus definiciones son idénticas. – skaffman

+0

Esto resolvió mi problema también. Debo decir que fue bastante molesto, estaba buscando un 'mail.jar' duplicado, pero después de usar una herramienta y buscar' javax.mail.Session' noté que Apache CXF depende de Apache Geronimo, que tiene su propia implementación JavaMail . – g00glen00b

3

Este es un problema de carga de clases. Por lo general, esto se debe a que la clase está en un jar en su servidor y en su aplicación. En este caso, es probable que desee eliminarlo de su aplicación. ¿Tiene algo como mail.jar en su WEB-INF/lib o EAR?

Cuestiones relacionadas