通过Java bean修改后正在删除文档

时间:2013-09-22 16:14:54

标签: java javabeans xpages xpages-ssjs

场景:我想要一种通用方法在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>

这是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) {

            }
        }
    }
}

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

Sven Hasselbach得到了 - 我的错。以下是适合您的正确代码:

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) {

            }
        }
    }
}