xe:viewJsonService和sessionAsSigner

时间:2016-11-18 09:41:41

标签: xpages xpages-extlib

是否可以使用相当于sessionAsSigner的ExtLib REST服务xe:viewJsonService(和xe:documentJsonService)?

如果我使用xe:customRestService并为doGet和doPost编写代码,我可以这样做,但只是想知道是否有办法对内置服务做同样的事情。

1 个答案:

答案 0 :(得分:3)

从源代码中我可以看出,遗憾的是你不能:(

这些服务扩展了抽象类'RestDominoService'。并且他们使用它的loadDatabase方法来获取数据库的句柄。它使用它的'defaultSession'成员字段来做到这一点。

protected void loadDatabase(DominoParameters parameters) throws NotesException {
    String dbName = parameters.getDatabaseName();
    if(StringUtil.isEmpty(dbName)) {
        if(defaultDatabase==null) {
            throw new IllegalStateException("No default database assigned to the service"); // $NLX-RestDominoService.Nodefaultdatabaseassignedtotheser-1$
        }
        this.database = defaultDatabase;
        this.shouldRecycleDatabase = false;
        return;
    }
    if(defaultSession==null) {
        throw new IllegalStateException("No default session assigned to the service"); // $NLX-RestDominoService.Nodefaultsessionassignedtotheserv-1$
    }
    this.database = DominoUtils.openDatabaseByName(defaultSession,dbName);
    this.shouldRecycleDatabase = true;
}

创建RestEngine时会设置此“defaultSession”,并使用DominoUtils.getCurrentSession()。这相当于xpages中的'session'变量,不幸的是不是sessionAsSigner。 似乎没有任何关系可以在RestEngine创建和生成响应的renderService方法之间进行更改。

    private class Engine extends RestViewJsonService {
        Engine(HttpServletRequest httpRequest, HttpServletResponse httpResponse, Parameters params) {
            super(httpRequest,httpResponse,params);
            setDefaultSession(DominoUtils.getCurrentSession());
            setDefaultDatabase(DominoUtils.getCurrentDatabase());
        }

如果你真的需要这样做,肯定可以修改它以允许它由属性控制,但这意味着你将构建自己的扩展库版本。

可以将'sessionAsSigner'属性添加到com.ibm.xsp.extlib.component.rest.DominoService,以及在相应的xsp-config文件中将其定义为属性。

创建休息引擎

时可以访问此属性
    private class Engine extends RestViewJsonService {
        Engine(HttpServletRequest httpRequest, HttpServletResponse httpResponse, Parameters params) {
            super(httpRequest,httpResponse,params);

            if (isSessionAsSigner()) {
                setDefaultSession(ExtLibUtil.getCurrentSessionAsSigner());
            } else {
                setDefaultSession(DominoUtils.getCurrentSession());
            }

            setDefaultDatabase(DominoUtils.getCurrentDatabase());
        }

我没有测试过,但是我的大脑说它会起作用,但是星期五晚上11点。

如果您不习惯于编写自己的扩展库版本,那么现在可能更容易坚持使用customRestService。