【问题标题】:Calling Java agent from LotusScript in XPages upload在 XPages 上传中从 LotusScript 调用 Java 代理
【发布时间】:2013-02-21 05:58:05
【问题描述】:

我正在使用带有标准文件上传控件的 XPage 上传文件。 在数据源上,我有一个 WebQuerySave 代理。

WQS-agent 在 LotusScript 中。

用户正在上传一个 XML 文件,我们有一个现有的帮助程序库来帮助解析正在上传的 XML - 这就是 WQS 在 LotusScript 中的原因。

由于我无法将上传的文件分离到服务器,我正在调用 Java 代理来将 XML 读取为字符串并将其存储在文档中。

我正在使用参数文档调用 Java 代理,所有基本内容。

在参数文档中,我包含了包含附件的文档的 UniversalID,这是我的问题!

Java 代理声称 UniversalID 无效:

“HTTP JVM: 4091 无效的通用 ID”

但是,如果我尝试在 LotusScript 代理中查找文档,则在调用 Java 代理之前,会使用相同的 UNID 找到该文档: 设置 tempDoc = db.Getdocumentbyunid(unid)

Java 代码:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import lotus.domino.Agent;
import lotus.domino.AgentBase;
import lotus.domino.AgentContext;
import lotus.domino.Database;
import lotus.domino.Document;
import lotus.domino.NotesException;
import lotus.domino.Session;

public class JavaAgent extends AgentBase {
    public void NotesMain() {
        try {
            Session session = getSession();
            AgentContext agentContext = session.getAgentContext();
            Database db = agentContext.getCurrentDatabase();
            Agent agent = agentContext.getCurrentAgent();

            // Get document used for passing data
            System.out.println(agent.getParameterDocID());

            Document paramDoc = db.getDocumentByID(agent.getParameterDocID());
            String UniversalID = paramDoc.getItemValueString("unid");

            System.out.println(UniversalID);
            Document doc = db.getDocumentByUNID(UniversalID);

当我运行 Java 代理时,我不会从打印命令中得到任何东西,但也许这是意料之中的......(?)

如果我在现有文档上手动运行所有内容,它就可以工作。但不是在通过浏览器提交的文档上。

在我看来,包含附件的文档还没有准备好用于 Java。

多米诺 8.5.3

非常感谢任何帮助!

/J

附:我是 Java 新手,所以你知道.. ;-)

【问题讨论】:

  • LotusScript WQS 代理中的上下文文档是内存中的文档,尚未保存。在 Java 代理中,getDocumentByUNID 正在当前数据库中查找已保存的文档。
  • 是的,我知道。我已经尝试保存文档上下文文档。但它在 Java 中仍然不可用。尝试在 Java 中睡觉,以防万一。但还是不行。
  • 我认为当您保存上下文文档时,UNID 会发生变化。
  • 您能否将 LotusScript 代码的相关部分添加到您的帖子中?另外,您能否扩展 Java 代码以显示您在 catch 块中拥有的内容?

标签: java xpages lotus-domino


【解决方案1】:

您能否将扩展库与 extlibx 包一起使用?如果是这样,那么已经内置了一个 XML 解析器,sbt.XmlNavigator。请参阅 XPages 扩展库一书的第 13 章。避免调用调用 Java 代理的 LotusScript 代理可能值得一看。您可以使用 Java 中的这些包,但也可以使用 SSJS。撕掉创可贴并使用它可能更容易(或另一个基于 Java 的 XML 解析器,我敢肯定有一些)。现在可能有点工作,但将来会更有用。

【讨论】:

  • 不,不幸的是,我只能访问更新包。但无论如何,我倾向于一个全面的 Java 解决方案,我正在研究一些看起来很有前途的包。
【解决方案2】:

我似乎记得上下文文档有一个临时 UNID,当您调用 save() 方法时,它会更改为其永久值。所以我最好的猜测是,您的 LotusScript 代码在保存之前正在读取上下文文档的universalId 属性。

因此,如果我是对的,只需将您的调用移至 LotusScript 代理中获取 universalId 属性,直到您保存上下文文档并将该值传递到您的 Java 代理。

【讨论】:

    【解决方案3】:

    记得在将 paramDoc 传递给 Java 代理之前将其保存在 LotusScript 代理中。

    【讨论】:

    • paramDoc 不是问题,它是包含 Java 中不可用的附件的文档。
    • 嗯..你说你的打印没有显示任何东西,这表明你在 Java 代理中没有 UnID。那么你怎么知道你有(正确的)UnID?
    【解决方案4】:

    我能解决的唯一方法是将 documentContext 中的所有项目复制到我在数据库中创建的新文档中。

    • 保存
    • 检索此新文档的 UNID
    • 将其传递给 agent.run - java 并且成功了!

    【讨论】:

    • 有道理,但我仍然不明白 getDocumentByUnID 是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多