Отправка электронной почты с вложением в приложении RCP Java с использованием javax

Мне нужно отправить электронное письмо с приложением, но у меня следующая ошибка.

!ENTRY org.eclipse.rap.ui 4 0 2015-08-10 11:45:25.505
!MESSAGE Unhandled event loop exception
!STACK 0

java.lang.LinkageError: loader constraint violation: when resolving method "javax.mail.internet.MimeMessage.setDataHandler(Ljavax/activation/DataHandler;)V " the class loader (instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader) of the current class, com/fotgroup/tecas/ui/dialog/EmailSender, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for resolved class, javax/mail/internet/MimeMessage, have different Class objects for the type setDataHandler used in the signature

at com.fotgroup.tecas.ui.dialog.EmailSender.sendMail(EmailSender.java:67)

Я не могу получить путь к изображению, потому что это RCP, и это также происходит, когда я пытаюсь использовать DataHandler.

2 ответа

Трудно сказать без манифестов связанных комплектов, но это похоже на ошибку установки фреймворка.

Я вижу, что здесь есть смесь классов JBoss ClassLoader и Equinox ClassLoader, и я предполагаю, что вы запускаете среду Equinox OSGi внутри структуры модулей JBoss. Остальная часть этого ответа предполагает, что это то, что вы делаете.

Чтобы сделать это, вам нужно будет делегировать загрузку "пакетов, предоставляемых JBoss", таких как API Java EE, в родительскую платформу JBoss Modules, иначе вы получите противоречивые проблемы с пространством классов (такие как LinkageError вы видите), когда вы звоните на серверные компоненты JBoss.

То, что вам нужно сделать, это добавить в системные пакеты платформы (пакеты, предоставляемые системным пакетом в среде Equinox). Вы делаете это, указав org.osgi.framework.system.packages.extra свойство при запуске.

Значение свойства должно включать любые пакеты, которые вы хотите добавить, и их версии, а также использовать ограничения (если вы хотите, чтобы все работало правильно).

Например, в этом случае вам потребуется как минимум (и, вероятно, больше, чем):

javax.mail;version=1.4;uses:="javax.activation,
   javax.mail.event,javax.mail.search",
javax.mail.event;version=1.4;uses:="javax.mail"
javax.mail.internet;version=1.4;uses:="javax.activation,
   javax.mail,javax.mail.util"
javax.mail.search;version=1.4;uses:="javax.mail,javax.mail.internet"
javax.mail.util;version=1.4;uses:="javax.activation,javax.mail.internet"

Обратите внимание, что причина, по которой вам нужно это сделать, на самом деле не вина OSGi. Вы пытаетесь получить доступ к нестандартным (т.е. не JRE) пакетам, которые существуют вне фреймворка изнутри фреймворка. Задача OSGi состоит в том, чтобы обеспечить выполнение зависимостей вашего кода во время выполнения, и это обычно означает "развернутые вами пакеты", в этом случае вы обращаетесь к пакетам, которые не приходят из пакетов, поэтому вам нужно сообщить OSGi, что они собой представляют.

Я нашел решение, чтобы избежать использования DataHandler, я использую следующий код

try {
MimeMessage m = new MimeMessage(getEmailSession());
InternetAddress[] to = new InternetAddress[] { new  InternetAddress("mail@domain.com") };
        m.setRecipients(Message.RecipientType.TO, to);
        if (valideMail) {
            m.setSender(new InternetAddress(user.getEmail()));
        }
        MimeMultipart multiPart = new MimeMultipart("mixed");
        MimeBodyPart contentPart = new MimeBodyPart();
        contentPart.setText("text", "UTF-8");
        multiPart.addBodyPart(contentPart);
        MimeBodyPart attachmentPart = new MimeBodyPart();
        attachmentPart.setContent(emailEntity.getAttachment(), "application/png");
        attachmentPart.addHeader("Content-Transfer-Encoding", "base64");
        attachmentPart.setDisposition(Part.ATTACHMENT);
        attachmentPart.setFileName(fileName);
        multiPart.addBodyPart(attachmentPart);
        m.setContent(multiPart);
        //
        Transport.send(m);
        //
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
Другие вопросы по тегам