将sessionScope java.util.TreeMap变量存储在xPage中的文档中

时间:2014-02-04 07:30:27

标签: xpages lotus-notes lotus-domino xpages-ssjs serverside-javascript

我正在开发一个应用程序,我正在创建一个java.util.TreeMap,其中包含从应用程序的各种其他文档中提取的数据,然后将treemap分配给sessionsScope变量。这工作正常。 现在我想提供一个功能,我需要将此地图存储在NotesDocument

但是当我尝试这样做时,我收到了一个错误。

var doc:NotesDocument = database.createDocument();
doc.replaceItemValue("Form","testForm");
print("json = "+sessionScope.get("Chart_Map"));
doc.replaceItemValue("Calender_Map",sessionScope.get("Chart_Map"));
doc.save();

例外:

执行JavaScript动作表达式时出错 脚本解释器错误,line = 4,col = 13:[TypeError]发生异常调用方法NotesDocument.replaceItemValue(string,java.util.TreeMap)null **

是否可以在java.util.TreeMap字段中存储notesdocument

如果是,那么如何实现?

如果不是那么为什么不呢?与serializability有什么关系?

2 个答案:

答案 0 :(得分:5)

除非使用MimeDomino文档数据源,否则不能将Java对象存储在Document字段中 http://www.openntf.org/main.nsf/blog.xsp?permaLink=NHEF-8XLA83

甚至更好的内置了这个功能的新openntf Domino API http://www.openntf.org/main.nsf/project.xsp?r=project/OpenNTF%20Domino%20API

使用MimeStorage

答案 1 :(得分:0)

Fredrik是对的,MimeDomino最有意义。如果你还没准备好,并且你的字段对于普通的Notes项目来说不是太大,你可以使用Sven建议的CustomDataBytes - 或者通过继承TreeMap来使用JSON。它看起来像这样:

import java.util.TreeMap;
import java.util.Vector;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import lotus.domino.Item;
import lotus.domino.NotesException;

public class TreeMapItem extends TreeMap<String, String> {
    private static final long   serialVersionUID    = 1L;
    public static TreeMapItem load(Item source) throws JsonSyntaxException, NotesException {
        Gson g = new Gson();
        TreeMapItem result = g.fromJson(source.getText(), TreeMapItem.class);
        return result;
    }
    public void save(Item target) throws NotesException {
        Gson g = new Gson();
        target.setValueString(g.toJson(this));
    }
}

我使用Google的Gson,这很简单,但您可能需要将其部署为插件,以便Java安全性能够正常运行。在XPages中也有JSON构建 - 多做一点工作。另一种方法是在Domino中使用2个字段,一个用于加载键,一个用于值 - 这与经典的Domino实践一致。

第三种方法是存储使用管道符分隔的值:

@SuppressWarnings({ "unchecked", "rawtypes" })
public void saveCompact(Item target) throws NotesException {
    Vector v = new Vector();
    for (Map.Entry<String, String> me : this.entrySet()) {
        v.add(me.getKey()+"|"+me.getValue());
    }
    target.setValues(v);
}

    @SuppressWarnings("rawtypes")
public static TreeMapItem loadCompact(Item source) throws NotesException {
    TreeMapItem result = new TreeMapItem();
    Vector v = source.getValues();
    for (Object o : v) {
        String[] candidate = o.toString().split("|");
        if (candidate.length > 1) {
            result.put(candidate[0], candidate[1]);
        }
    }
    return result;
}

告诉我们它是如何为您服务的