You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Domino中通过LS2J从AgentBase获取PrintWriter?

解决LS2J调用Java类时getAgentOutput()空指针问题

你遇到的空指针问题根源在于:你的WebPrinter类虽然继承了AgentBase,但它是通过LS2J手动创建实例的,并非作为Domino Java代理被系统启动。这种情况下,AgentBase内部的代理运行上下文没有被初始化,调用getAgentOutput()自然无法获取到有效的PrintWriter,从而抛出空指针异常。

以下是两种无需将LotusScript代理重构为Java代理的解决方案:

方案一:从LotusScript传递PrintWriter给Java方法

这是最直接的方案,核心思路是让LotusScript代理获取自身的输出流,再传递给Java类使用。

1. 修改Java类

移除AgentBase继承,改为在方法参数中接收PrintWriter:

import java.io.PrintWriter;

public class WebPrinter {
    public boolean printFile(String fileName, PrintWriter pw) {
        try {
            // 直接使用传入的PrintWriter输出内容
            pw.println("开始处理文件:" + fileName);
            // 你的文件读取/输出逻辑...
            
            return true;
        } catch (Exception e) {
            // 把异常输出到Web端
            e.printStackTrace(pw);
            return false;
        }
    }
}

2. 修改LotusScript代码

获取当前Web代理的输出流,通过LS2J转换为Java的PrintWriter,再传递给Java方法:

Use "JavaWebCode"
Dim jSession As New JavaSession
Dim jWebPrinterClass As JavaClass
Dim jWebPrinterObj As JavaObject
Dim jPrintWriterClass As JavaClass
Dim jPrintWriterObj As JavaObject
Dim outputStream As NotesOutputStream

' 获取当前LotusScript代理的输出流
Set outputStream = CurrentAgent.GetAgentOutputStream()

' 创建Java的PrintWriter实例,传入LotusScript的输出流
Set jPrintWriterClass = jSession.Getclass("java.io.PrintWriter")
Set jPrintWriterObj = jPrintWriterClass.Createobject(outputStream)

' 实例化WebPrinter类
Set jWebPrinterClass = jSession.Getclass("com.test.WebPrinter")
Set jWebPrinterObj = jWebPrinterClass.Createobject()

' 调用Java方法并传入PrintWriter
result = jWebPrinterObj.printFile(fileName, jPrintWriterObj)

' 刷新并关闭流,确保内容输出
jPrintWriterObj.flush()
jPrintWriterObj.close()

方案二:传递代理上下文给Java类(可选)

如果必须保留AgentBase的使用,可以从LotusScript中获取当前代理的Java实例,传递给你的类来初始化上下文,但这种方法复杂度更高:

1. 修改Java类

添加一个方法接收Agent实例,用于初始化上下文:

import java.io.PrintWriter;
import lotus.domino.Agent;
import lotus.domino.AgentBase;
import lotus.domino.Session;

public class WebPrinter extends AgentBase {
    public void setAgentContext(Agent agent) throws Exception {
        Session session = agent.getParent();
        this.setSession(session);
        this.setAgent(agent);
    }

    public boolean printFile(String fileName) {
        try {
            PrintWriter pw = getAgentOutput();
            pw.println("处理文件:" + fileName);
            // 你的逻辑...
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

2. 修改LotusScript代码

获取当前代理的Java对象,传递给WebPrinter实例:

Use "JavaWebCode"
Dim jSession As New JavaSession
Dim jWebPrinterClass As JavaClass
Dim jWebPrinterObj As JavaObject
Dim jCurrentAgent As JavaObject

' 获取当前代理的Java Agent实例
Set jCurrentAgent = CurrentAgent

' 实例化WebPrinter类
Set jWebPrinterClass = jSession.Getclass("com.test.WebPrinter")
Set jWebPrinterObj = jWebPrinterClass.Createobject()

' 设置代理上下文
Call jWebPrinterObj.setAgentContext(jCurrentAgent)

' 调用方法
result = jWebPrinterObj.printFile(fileName)

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 00:42:43