如何在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
相关产品推荐
相关产品推荐

