NotesException:Older 服务器上的版本不支持此方法

NotesException:Older version on server does not support this method

Lotusscript 调用 Java class 出现此错误。 抽象的: 产品领域:Domino Designer on Eclipse (DDE)

技术领域:应用程序开发

平台:Windows 2008 R2 64 位

版本:8.5.3

可重现:总是

1 在 Notes 数据库中创建 SqlTest 脚本库(Java)。 Model.java:

    import java.sql.Connection;

    import java.sql.DriverManager;

    import java.sql.SQLException;

    import java.sql.Statement;

    import lotus.domino.*;

    public class Model{

    /**

    Get database connection
    @return
    */

    public static Connection getConn(){

    Connection conn = null;

    String SqlDriverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";

    String SqlDBUrl = "jdbc:sqlserver://22.11.95.30:1433;DatabaseName=TMSTEST";

    String SqlUserName = "sa";

    String Sqlpwd = "1q2w3e4r!";

    try {

    Class.forName(SqlDriverName);

    conn = DriverManager.getConnection(SqlDBUrl, SqlUserName, Sqlpwd);

    System.out.println("database connection sucess");

    } catch (Exception e) {

    e.printStackTrace();

    System.out.println("database connection failure");

    }

    return conn;

    }

    public static boolean test1(String id){

    //System.out.println("---------------------");

    Connection conn = getConn();

    Statement stmt = null;

    String sql;

    // Open the current Notes db

    try {

    Session s = NotesFactory.createSession("22.11.95.100:63148", "admin test/testeam", "testtest");

    System.out.println("session is OK");

    Database db = s.getCurrentDatabase();

    //  System.out.println("Title of URL database: \"" + db.getTitle() + "\"");

    if (db.isOpen())

    System.out.println("Is open");

    else

    System.out.println("Not open");
    Document doc = null;

    //through the id para get the Notesdocument

    doc = db.getDocumentByUNID(id);

    System.out.println(id);

    //insert the Notesdocument data to sql

    if (doc != null) {

    sql = "insert into TEST_USER(userID, userName,xqbh) values('123456','"+doc.getItemValueString("fld_xqbh")+"', '"+doc.getItemValueString("fld_xqmc")+"')";

    System.out.println("SQL :"+sql);

    stmt = conn.createStatement();

    stmt.execute(sql);

    System.out.println("excute finish");

    return true;

    }else{

    return false;

    }

    } catch (NotesException e) {

    // TODO auto generate catch block

    e.printStackTrace();

    return false;

    }catch(SQLException se){

    se.printStackTrace();

    return false;

    }finally{

    try{

    if(stmt != null) stmt.close();

    if(conn != null) conn.close();

    }catch(Exception e1){

    e1.printStackTrace();

    }

    }

    }

    }

2 个在备注表格中:

    Uselsx "*javacon"
    Use "SqlTest"


    Function jTest(id As String) As Boolean

        Dim jSession As New JAVASESSION

        Dim jClass As JAVACLASS

        Dim jObj As JavaObject

        Set jClass = jSession.GetClass("Model")

        'Msgbox jClass.className 

        Call jClass.test1(id)
    End Function

3 通过 Lotusscript 使用 java class:

'call java class

Call jTest(doc.UniversalID)

4 调试程序通过IDE(Lotus Domino Designer) 在java 控制台日志中找到错误。使用一些打印语句并找到错误行([=​​45=]):

   Database db = s.getCurrentDatabase();

5 我看过关注帖

Invoking method on a Java class from lotus script (LS2J)

google没事,烦恼了好几天。 谢谢大家,感谢 advance.First Whosebug 中的帖子。

问题出在您获取会话的方式上:您打开了一个与当前打开的会话无关的全新会话。该新会话没有当前数据库,因为它未连接到您的前端会话。

只需使用此行初始化您的会话:

Session session = getSession();

然后 getCurrentDatabase 就可以了。

感谢 Torsten Link。 我多次测试 java 脚本库,都失败了。新建一个 Javaagent 而不是 java 脚本库然后一切就清楚了。

核心 LotusScript 代码:

    Dim agent As NotesAgent
    Set db = s.CurrentDatabase
    Set agent = db.GetAgent("javaAgent")
    If agent.RunOnServer(doc.NotesID) = 0 Then
      Messagebox "Agent ran",, "Success"
    Else
      Messagebox "Agent did not run",, "Failure"
    End If

核心java代理代码:

     Agent agent = agentContext.getCUrrentAgent()
     Document doc = db.getDocumentbyID(agent.getParameterDocID())

注意:运行时安全级别,您需要允许受限操作。