2012-01-11 34 views
7

Tôi đang tạo một phiên thư bên trong ngữ cảnh servlet của mình và sau đó sử dụng JNDI để chèn nó vào thiết kế khung công tác của tôi. Đây là cách bối cảnh trông:Mùa xuân - không thể chuyển đổi 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" 
/> 

Và nơi tôi đang mang nó trong:

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

và nơi tôi đang tiêm nó vào mùa xuân java email người gửi:

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

Bây giờ, đây là thông báo tôi nhận được:

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, cái gì ???? Tại sao nó cố gắng chuyển đổi nó?

Trả lời

17

Bạn có nhiều khả năng có hai bản sao nếu javax.mail.Session trên đường dẫn lớp học của bạn. Có thể xuất phát từ thư viện nội bộ của máy chủ ứng dụng, thư mục khác có thể được đóng gói trong thư mục lib của ứng dụng của bạn. Hai bản sao sẽ đụng độ khi bạn thử và sử dụng chúng như thế này.

Xóa một trong thư mục lib của ứng dụng và thử lại.

+0

Đó là chính xác nó là gì, nhưng tôi không hiểu điều này sẽ là một vấn đề. Có phải là trình nạp lớp phân tách các cá thể bằng cách nào đó và nó so sánh địa chỉ trong bộ nhớ? – Thom

+1

@Thom: Java xử lý hai lớp có cùng tên nhưng được tải từ các trình nạp lớp khác nhau là không tương thích. Bạn không thể đúc từ người này sang người khác, ngay cả khi định nghĩa của họ giống hệt nhau. – skaffman

+0

Điều này cũng giải quyết được vấn đề của tôi. Tôi phải nói rằng nó khá khó chịu, tôi đang tìm kiếm một bản sao 'mail.jar', nhưng sau khi sử dụng một công cụ và tìm kiếm' javax.mail.Session' tôi nhận thấy rằng Apache CXF phụ thuộc vào Apache Geronimo có thực thi JavaMail của riêng nó . – g00glen00b

3

Đây là sự cố tải lớp. Thông thường, điều này là do cả hai lớp đều nằm trong một cái bình trong máy chủ của bạn trong đơn đăng ký của bạn. Trong trường hợp này, bạn có thể muốn xóa nó khỏi ứng dụng của bạn. Bạn có nội dung nào đó như mail.jar trong WEB-INF/lib hoặc EAR của mình không?

Các vấn đề liên quan