Xpages JavaBean静态Notes对象导致错误保存

时间:2018-10-06 17:01:05

标签: xpages javabeans lotus-domino

在此JavaBean中,我将某些对象写为(静态)。但是,当我到达logDoc.save()方法时,它将返回错误。删除所有(静态),所有运行正常。 控制台中的错误是:

HTTP JVM: lotus.domino.local.Document method: save, row: -1: 
NotesException: Notes error: You are not authorized to perform that operation

HTTP JVM:lotus.domino.local.NotesBase method: CheckObject, row: -1: 
NotesException: Object has been removed or recycled

取决于“匿名”的ACL设置。

任何人都可以在这里向我解释静态对象的问题吗?

    public class AnyRest extends CustomServiceBean implements Serializable  {

    private static final long serialVersionUID = 3548995909847938225L;

    private (static) Database logDB=null;
    private (static) Document logDoc=null;
    private (static) RichTextItem logBody=null;

    private  (static) void log(String text) {
        if (logDB==null) logDB= ExtLibUtil.getCurrentDatabase();
        try {
            if (logDoc==null) {
                logDoc=logDB.createDocument();
                logDoc.replaceItemValue("form","log");
                logBody=logDoc.createRichTextItem("Body");
            }
            logBody.appendText(text);
            logBody.addNewLine();
            logDoc.save();
        } catch(NotesException ne) {
            logStackTrace(ne);
        }
    }


    private (static) void destroyLog() {

        try {
            if (logDoc!=null) {
                logDoc.save();
                logDoc.recycle();
                logDoc=null;
            }
            if (logDB!=null) {
                logDB.recycle();
                logDB=null;
            }

        } catch (Exception e) {
            logStackTrace(e);
        }
    }

    public String doPost(String strObject){
        //do useful things
        log("useful post data")
    }
}

2 个答案:

答案 0 :(得分:4)

Domino对象不可可序列化。

您只能在类方法中使用Domino对象。

在类字段中存储数据,例如:

  • Domino服务器的名称

  • 数据库路径

  • 视图名称

  • 文档ID或文档ID列表,

  • 文档项目的值,

这样,您可以在需要时轻松地再次获得Domino对象。
但是,切勿将Domino对象(如会话,数据库,视图和文档)存储在类字段中。
(除非您在每个新的请求及其字段都实例化该类,但是使用“静态”绝对不是这种情况。)

答案 1 :(得分:1)

通过这样提供的会话检索的

后端对象,将在每个请求结束时回收。您应该重写该类以重新获取每个请求的文档,或者每次创建一个新请求,或者在创建文档时存放该文档的UNID,然后使用getDocumentByUNID。