我在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代码启动时才会发生错误。
答案 0 :(得分:0)
它看起来像一个线程问题。你可以去尝试一些事情:
让我们知道它是怎么回事
的更新强>
尝试超出标准的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插件更容易使用。
所以这些是创建插件的步骤
以下网站也很有帮助: