0

我想连接到远程 OpenOffice 实例的 XPage 上有一个按钮。OpenOffice 已启动并正在侦听套接字连接。

按钮的 onclick 事件在 SSJS 之后运行:

    oo = new com.test.OpenOffice();
    oo.init("主机=127.0.0.1,端口=8107");
    oo.openFile("C:\\TEMP\\Test.odt");

代码引发异常jva.lang.IlleagalStateException: NotesContext not initialized for the thread

init异常在类的方法中引发OpenOffice

OpenOffice 类的相关部分是以下代码:

公共类 DHOpenOffice 实现 Serializable {
    私有静态最终长序列版本UID = -7443191805456329135L;
    私有 XComponentContext xRemoteContext;
    私有 XMultiComponentFactory xMCF;
    私有 XTextDocument oTextDocument;

    公共 DHOpenOffice() {
        xRemoteContext = null;
        xMCF = 空;
        oTextDocument = null;
    }   

    public void init(String hostAdr) 抛出 java.lang.Exception {
        xRemoteContext = null;

        XComponentContext xLocalContext = Bootstrap.createInitialComponentContext(null);
        XUnoUrlResolver xUrlResolver = UnoUrlResolver.create(xLocalContext);

        字符串 sConnect = "uno:socket," + hostAdr + ",tcpNoDelay=0;urp;StarOffice.ServiceManager";

        对象上下文 = xUrlResolver.resolve(sConnect);
        xRemoteContext = UnoRuntime.queryInterface(XComponentContext.class, context);  
        xMCF = xRemoteContext.getServiceManager();  
    }

代码行Object context = xUrlResolver.resolve(sConnect);是引发异常的行。

为什么会这样?此异常的原因是什么,我该如何解决这种情况?

注意:类代码在独立应用程序中运行流畅。该错误仅在代码由 SSJS 代码启动时发生。

4

2 回答 2

0

它看起来像一个线程问题。有很多事情你可以去尝试:

  • 将整个交互包装到一个自定义类中,并从托管 bean 中使用它,而不是从 SSJS 中调用它
  • 确保不要将任何 Notes 对象交给自定义类,只有您自己的
  • 检查Open Document Toolkit是否足以执行您感兴趣的操作,因此您不需要运行 OO

让我们知道怎么回事

更新
尝试脱离标准的 XPages 周期。一种方法是部署自定义插件 servlet:

 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;

public class OpenOfficeServlet extends HttpServlet {
   // Your code goes here
}

您需要正确获取 plugin.xml:

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
   <extension point="org.eclipse.equinox.http.registry.servlets">
         <servlet alias="/ooproxy" class="com.yourcompany.OpenOfficeServlet" />
   </extension>
</plugin>

然后,您可以例如将 JSON 结构或可序列化的 Java 对象与数据一起发布到 servlet 并在那里处理它(如果需要,异步)。您使用 updatesite.nsf 部署此类插件

于 2014-03-10T09:08:22.897 回答
0

感谢@stwissel 的回答,我能够解决问题(他为我指出了正确的方向)。

我可以用一个简单的 OSGI 插件来解决这个问题。servlet 方法也解决了这个问题,但对我来说 OSGI 插件更容易使用。

所以这些是创建插件的步骤

  • 开始一个新的插件项目
  • 将打开的office jar 文件复制到项目中并将它们包含到构建路径中
  • 将使用 UNO API 的自定义类复制到插件中
  • 为插件创建一个功能项目
  • 创建更新站点
  • 通过更新站点部署插件

以下站点也很有帮助:

于 2014-03-26T07:27:00.190 回答