1

场景:我想要一种通用方法在 XPage 上的(新)文档数据源中创建读者和作者字段。我现在的方法是将文档从数据源交给 postSaveDocument 事件中的 bean 方法。该方法还可以设置为是否保存文档,具体取决于将要调用的事件(例如 querySaveDocument 事件)。在我的方法中检查和设置的项目在我的数据源的 postNewDocument 事件中设置。奇怪的是,文档没有被保存。在调用 bean 方法后删除。我很惊讶……你有什么想法吗,这里发生了什么?

postNewDocument 事件代码:

document1.setValue("$rnaAuthors", "Foo")
document1.setValue("Foo", "Bar")

postSaveDocument 事件代码:

rna.save(document1.getDocument(true), true)

bean 在我的 faces-config.xml 中配置:

<managed-bean>
        <managed-bean-name>rna</managed-bean-name>
        <managed-bean-class>com.olb.ReadWriteAccess
        </managed-bean-class>
        <managed-bean-scope>view</managed-bean-scope>
    </managed-bean>

这是豆代码:

package com.olb;

import java.io.Serializable;
import java.util.Vector;

import lotus.domino.Document;
import lotus.domino.Item;
import lotus.domino.NotesException;

public class ReadWriteAccess implements Serializable {

    private static final long serialVersionUID = 1L;

    @SuppressWarnings("unchecked")
    public void save(Document doc, boolean saveIt) {
        try {
            // check if special items exist
            if (!doc.hasItem("$rnaReaders") && !doc.hasItem("$rnaAuthors"))
                return;

            // now fetch all the items by name and set the property
            Vector v = doc.getItemValue("$rnaReaders");
            for (int x = 0; x < v.size(); x++) {
                Item it = doc.getFirstItem(v.elementAt(x).toString());
                if (it != null) {
                    if (!it.isReaders())
                        it.setReaders(true);
                }
            }
            v = doc.getItemValue("$rnaAuthors");
            for (int x = 0; x < v.size(); x++) {
                Item it = doc.getFirstItem(v.elementAt(x).toString());
                if (it != null) {
                    if (!it.isReaders())
                        it.setReaders(true);
                }
            }

            if (saveIt) {
                doc.save();
            }

        } catch (NotesException e) {
            e.printStackTrace();
            try {
                if (saveIt) {
                    doc.replaceItemValue("$rnaError", e.getMessage());
                    doc.save();
                }
            } catch (Exception e2) {

            }
        }
    }
}
4

3 回答 3

2

在您的代码中,您设置的是读者字段而不是作者字段。XPages 引擎尝试恢复文档,但找不到它。这就是为什么在您第二次单击按钮后会引发“文档已被删除”错误的原因。

于 2013-09-25T11:31:26.737 回答
0

您应该尽量避免运行两次的保存操作(例如 PostSave -> XPages 保存了文档,然后您再次保存),坚持使用 QuerySave 并仅移交文档。你需要recycle()你的物品,否则你的 bean 会流血 C 对象。正如 Frantisek 建议的那样,切换到请求范围。

于 2013-09-22T23:34:09.830 回答
0

斯文·哈塞尔巴赫明白了——我的错。这是适合您的正确代码:

package com.olb;

import java.io.Serializable;
import java.util.Vector;

import lotus.domino.Document;
import lotus.domino.Item;
import lotus.domino.NotesException;

public class ReadWriteAccess implements Serializable {

    private static final long serialVersionUID = 1L;

    @SuppressWarnings("unchecked")
    public void save(Document doc, boolean saveIt) {
        try {
            // check if special items exist
            if (!doc.hasItem("$rnaReaders") && !doc.hasItem("$rnaAuthors"))
                return;

            // now fetch all the items by name and set the property
            Vector v = doc.getItemValue("$rnaReaders");
            for (int x = 0; x < v.size(); x++) {
                Item it = doc.getFirstItem(v.elementAt(x).toString());
                if (it != null) {
                    if (!it.isReaders())
                        it.setReaders(true);
                }
            }
            v = doc.getItemValue("$rnaAuthors");
            for (int x = 0; x < v.size(); x++) {
                Item it = doc.getFirstItem(v.elementAt(x).toString());
                if (it != null) {
                    if (!it.isAuthors())
                        it.setAuthors(true);
                }
            }

            if (saveIt) {
                doc.save();
            }

        } catch (NotesException e) {
            e.printStackTrace();
            try {
                if (saveIt) {
                    doc.replaceItemValue("$rnaError", e.getMessage());
                    doc.save();
                }
            } catch (Exception e2) {

            }
        }
    }
}
于 2013-09-25T21:07:36.543 回答