使用javax

时间:2015-08-10 09:54:52

标签: java javamail sendmail rcp javax.mail

我需要发送附带附件的电子邮件,但我遇到以下错误。

!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 个答案:

答案 0 :(得分:1)

如果没有所涉及的捆绑包的清单,很难说,但这看起来像是一个框架设置错误。

我可以看到这里有JBoss模块ClassLoader和Equinox ClassLoader,我猜你在中启动了Equinox OSGi框架 JBoss模块框架。这个答案的其余部分假定这是你正在做的事情。

为了完成这项工作,您需要委托加载" JBoss提供的软件包"例如,对于父JBoss模块框架的Java EE API,或者当您调用JBoss服务器组件时,您将遇到不一致的类空间问题(例如您正在看到的LinkageError)。 / p>

您需要做的是添加到框架系统包(Equinox框架中的系统包提供的包)。您可以通过在启动时指定org.osgi.framework.system.packages.extra属性来执行此操作。

该属性的值需要包含您要添加其版本的所有包,并使用约束(如果您希望工作正常)。< / p>

例如,在这种情况下,您至少需要(可能更多):

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的工作是强制执行代码的运行时依赖性,这通常意味着您已部署的捆绑包&#34;在这种情况下,您可以访问来自捆绑包的软件包,因此您需要告诉OSGi它们是什么。

答案 1 :(得分:0)

我找到了解决方案,为避免使用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;
    }