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