将XPage与OpenOffice连接

时间:2014-03-10 07:56:48

标签: xpages openoffice.org uno

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

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

    oo = new com.test.OpenOffice();
    oo.init("host=127.0.0.1,port=8107");
    oo.openFile("C:\\TEMP\\Test.odt");

代码提出了例外jva.lang.IlleagalStateException: NotesContext not initialized for the thread

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

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

public class DHOpenOffice implements Serializable {
    private static final long serialVersionUID = -7443191805456329135L;
    private XComponentContext xRemoteContext;
    private XMultiComponentFactory xMCF;
    private XTextDocument oTextDocument;

    public DHOpenOffice() {
        xRemoteContext = null;
        xMCF = null;
        oTextDocument = null;
    }   

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

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

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

        Object context = xUrlResolver.resolve(sConnect);
        xRemoteContext = UnoRuntime.queryInterface(XComponentContext.class, context);  
        xMCF = xRemoteContext.getServiceManager();  
    }

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

为什么会这样?这个例外的原因是什么?我该如何解决这个问题?

N.B。:类代码在独立应用程序中平稳运行。仅当代码由SSJS代码启动时才会发生错误。

2 个答案:

答案 0 :(得分:0)

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

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

让我们知道它是怎么回事

更新
尝试超出标准的XPage周期。一种方法是部署自定义插件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

部署此类插件

答案 1 :(得分:0)

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

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

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

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

以下网站也很有帮助: