2012-01-11 18 views
7

Sunucumun içeriği içinde bir posta oturumu oluşturmak ve daha sonra JNDI'yi yay çerçeve tasarımım içine enjekte etmek için kullanıyorum. İşte bağlam nasıl göründüğü:Spring - javax.mail.session dosyasını dönüştürebilirsiniz

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

Ve nerede o getiriyorum:

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

:

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

ve Bahar java posta gönderene enjekte ediyorum nerede Şimdi burada aldığım mesaj:

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, ne ???? Neden onu değiştirmeye çalışıyor?

cevap

17

Sınıfınızda javax.mail.Session varsa büyük ihtimalle iki kopyaya sahip olursunuz. Muhtemelen uygulama sunucusu iç kütüphanelerinden gelir, diğeri muhtemelen uygulamanızın lib dizininde bulunur. Bunları kullanmayı denediğinizde iki kopya çatışacaktır.

Uygulamanızın lib dizinindeki bir dizini kaldırın ve yeniden deneyin.

+0

Tam olarak ne olduğu, ama bunun bir sorun olacağını anlamadım. Sınıf yükleyici, örnekleri bir şekilde ayırıyor ve adresi bellekle karşılaştırıyor mu? – Thom

+1

@Thom: Java, aynı ada sahip iki sınıf için davranır, ancak farklı sınıf yükleyicilerinden uyumsuz olarak yüklenir. Tanımları aynı olsa bile, birinden diğerine atlayamazsınız. – skaffman

+0

Bu benim de sorunumu çözdü. Oldukça can sıkıcı olduğunu söylemeliyim, bir 'mail.jar' kopyası arıyordum, fakat bir araç kullandıktan ve javax.mail.Session'ı aradıktan sonra Apache CXF'in kendi JavaMail uygulamasını içeren Apache Geronimo'ya bağlı olduğunu fark ettim. . – g00glen00b

3

Bu bir sınıflandırma sorunudur. Genellikle bu, sınıfınızın, uygulamanızdaki sunucunuzdaki ve'daki bir kavanozda bulunmasıdır. Bu durumda, muhtemelen uygulamanızdan kaldırmak isteyebilirsiniz. WEB-INF/lib veya EAR'de mail.jar gibi bir şey var mı?

İlgili konular