我需要发送附带附件的电子邮件,但我遇到以下错误。
!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时也会发生这种情况。
答案 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;
}