Java脚本库中的NullPointerException

时间:2012-06-26 18:54:21

标签: java lotus-notes lotus-domino lotusscript jsch

我正在迈向Java的第一步 - 尝试在Domino Designer 8.5.2中创建一个简单的Java脚本库,以使用JSch 0.1.48执行SFTP文件传输。该库将通过LS2J从LotusScript代理调用。这是我的脚本库中的SFTP类,基于this SO answer

import com.jcraft.jsch.*;

public class SFTP {
    public String GetFile(String host, String user, String pass, 
                          String localPath, String remotePath) {
        JSch jsch = new JSch();
        Session session = null;
        try {
            session = jsch.getSession(user, host, 22);
            session.setConfig("StrictHostKeyChecking", "no");
            session.setPassword(pass);
            session.connect();
            Channel channel = session.openChannel("sftp");
            channel.connect();
            ChannelSftp sftpChannel = (ChannelSftp) channel;
            sftpChannel.get(remotePath, localPath);
            sftpChannel.exit();
            session.disconnect();
        } catch (JSchException e) {
            e.printStackTrace();
        } catch (SftpException e) {
            e.printStackTrace();
        }
        String result = "OK";
        return result;
    }
}

当我从Java代理调用此函数时,它似乎没有任何问题。当我通过LS2J从LotusScript代理调用它时,它会传输文件但是它会抛出错误318 - LS2J错误:抛出java.lang.NullPointerException。 Java堆栈跟踪是:

java.lang.NullPointerException
    at lotus.notes.AgentSecurityManager.checkRelatedThreadGroup(Unknown Source)
    at lotus.notes.AgentSecurityManager.checkAccess(Unknown Source)
    at java.lang.Thread.checkAccess(Thread.java:378)
    at java.lang.Thread.interrupt(Thread.java:506)
    at com.jcraft.jsch.Session.disconnect(Session.java:1630)
    at SFTP.GetFile(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
    at java.lang.reflect.Method.invoke(Method.java:600)
    at lotus.domino.JavaConnectInvoker.invoke(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
    at java.lang.reflect.Method.invoke(Method.java:600)
    at lotus.domino.JavaConnectLoader.invoke(Unknown Source)

问题似乎与session.disconnect()调用有关。我发现其他人with similar issues从其他应用程序调用JSch,但如果它是一个JSch错误,我会认为Java代理会抛出相同的异常。堆栈跟踪使它看起来像是一个Domino安全问题,但我不知道要允许此操作进行哪些调整。代理已设置为允许受限操作,因此不是。此forum post具有类似的堆栈跟踪,并表明该问题可能是由Domino拥有其线程组的清理权限引起的。

我需要在Domino端进行安全性更改吗?我可以删除session.disconnect()而不用孤立服务器上的连接吗?

1 个答案:

答案 0 :(得分:1)

问题发生在AgentSecurityManager中,您可以在this blog entry中阅读。它基本上是一个垫片,Domino AMGR插入JVM以强制执行Domino的安全策略。

检查以确保您已授予代理使用受限操作的权限。 (在Lotus的古怪术语的另一个示例中,签名者必须拥有服务器文档的“签名或运行无限制方法和操作”字段的权限,但代理必须在代理属性框的安全选项卡上授予“允许限制”权限操作“)

如果它不是那么简单的话,那么我建议你尝试将com.jcraft.jsch。*的jar从Domino脚本库中取出并放入服务器上的jvm / lib / ext文件夹中文件系统。存储在文件系统上的jar的安全性处理不同,它可能会解决问题。