当前位置: 首页 > 知识库问答 >
问题:

将JavaMail1.5与XPages一起使用

龚鸿羽
2023-03-14

我有一个XPage应用程序,它应该通过IMAP(和SSL)从GMail读取邮件,并将它们存储在NSF数据库中。

因此,我将java代码移到OSGI-Plugin中,并导出包,这样我仍然可以在XPage中使用它。打开javamail的debug显示了正确的1.5版本。但是现在不管我是使用imap还是imaps作为协议,我都会得到异常javax.mail.nosuchProviderException

我错过了什么?为什么我不能在OSGi-plugin中使用JavaMail1.5jar-file?

共有1个答案

江敏学
2023-03-14

javax.mail的代码实际上并不是OSGi友好的。它使用线程上下文类加载器查找实例化实现。

您可以通过以下方式对此进行欺骗:

  • 将javax.mail和com.sun.mail.imap安装到OSGi容器中。版本1.5.2具有OSGi清单头,因此它应该可以工作
  • 当您调用javax.mail api的一个加载提供程序的函数时,请将线程上下文类加载器设置为一个确定知道imap类的类加载器。
Thread thread = Thread.currentThread();
ClassLoader previousCl = thread.getContextClassLoader();
thread.setContextClassLoader(IMAPStore.class.getClassLoader());
try {
    session.getStore("imaps");
} finally {
    thread.setContextClassLoader(previousCl);
}

一个不那么难看的解决方案是跳过javax.mail API的使用,直接使用imap的类。

例如:

Session session = Session.getDefaultInstance(...);
Store imapStore = new IMAPStore(session, url);

在Java EE中使用SPI或类似的解决方案时,通常可以通过跳过工厂机制(使用线程上下文类加载器和其他技巧)并直接实例化实现类来实现相同的功能。

com.sun.mail.handlers.multipart_mixed incompatible with javax.activation.DataContentHandler

我现在可以想象以下几种选择:

  • 删除javax.activation包。这可能会解决问题,因为在这种情况下,每个包都将连接到系统包。但是,您仍然可以稍后获得ClassNotFoundExceptions...与类加载器的错误实践作斗争:)。
  • 从系统包中删除javax.activation。在这种情况下,每个人都将电线连接到捆上。然而,同样的问题也会发生,javax.activation bundle(或TCC)看不到应该加载的类。
  • 在stacktrace中找到一个点,您可以在这里更改TCC并设置一个可以看到所有必需类的类加载器。这也是monoholitic技术的常见技巧(就像在最初的示例中一样,但现在是这个函数调用)。
  • 找到一种具有OSGi特性但更友好的技术。如果你能找到一个,请在这里发布:)。
 类似资料:
  • 问题内容: 因此,我一直在为这个(应该是)简单的练习而绞尽脑汁,以使该程序将日期字符串转换为对象,对其进行格式化,并在完成后将其作为字符串再次返回。 这是程序的最后一点,它从文件中获取一小段文本,将其分解为单独的记录,然后将记录分解为单独的数据并将它们分配给个人对象。 我已经在多个位置检查了该代码,并且该代码完全执行了应该执行的操作,直到调用了format函数(该函数抛出)为止。为对象分配了应该分

  • 问题内容: 我想在目录中获取具有特定扩展名的文件列表。在中,我看到了可以做到这一点的方法。 由于我需要特定的扩展名,因此我创建了一个。但是,当我与此一起使用时,出现编译错误。我以为自以来,我应该能够做到这一点。代码如下: 最后一行显示编译错误: 类型的方法不适用于类型的参数 我正在尝试使用,不是。为何编译器无法识别这一点? 如果我编写自己的扩展筛选器,则此方法有效。我宁愿使用而不愿自己写。我究竟做

  • 问题内容: 我正在尝试在我的watchKit应用中使用firebase数据库。我已经在我的iPhone应用程序上开发了此功能,但是发现在我的Watch应用程序上很难做到这一点。当我尝试将firebase导入watch应用程序的VC类中时,它正在创建error 。 可以在Watch app中使用Firebase吗? 问题答案: 可悲的是,没有支持,并由于这样的事实,有没有支持在这些版本中,并高度依赖

  • 问题内容: 当请求来自Ajax.ActionLink(使用Http方法发布)时,是否可以在控制器操作上使用ValidateAntiForgeryToken属性。替代方法似乎是手动滚动JQuery Ajax请求,但我很好奇MVC Ajax框架中是否有办法。 问题答案: 我还没看过。您必须将令牌放入POST中记录的数据中。每次都使用相同的防伪令牌ID(或名称,我不记得了),但是您必须非常小心,并确保您

  • 问题内容: 最近,我开始与路由器一起使用来构建应用程序。 我通常将use 用于依赖项和代码管理。但是,当我尝试包含包含语法的文件时会出现问题。 这就是我目前所拥有的: 如何将IndexComponent放在其自己的文件中并在此文件中调用它?我尝试了通常的方法(与骨干和反应相同),但是由于语法错误。 问题答案: 所以我自己弄清楚了。 我从此仓库获得了必要的文件和说明:jsx- requirejs-p

  • 所以我一定是错过了什么,我希望执行一个语句块,如果可选的存在,否则抛出异常。 如果不是null,则打印hellow world。如果是,则抛出运行时异常。