Xpages xe:viewJsonService和sessionAsSigner

Xpages xe:viewJsonService和sessionAsSigner,xpages,xpages-extlib,Xpages,Xpages Extlib,是否可以将ExtLib REST服务xe:viewJsonService(和xe:documentJsonService)与sessionAsSigner等效使用 如果我使用xe:customRestService并为doGet和doPost编写代码,我可以做到这一点,但我只是想知道是否有一种方法可以对内置服务执行同样的操作。从源代码中我可以看出,很遗憾,没有,您不能:( 这些服务扩展了抽象类“RestDominoService”。它们使用它的loadDatabase方法来获取数据库的句柄。它使

是否可以将ExtLib REST服务xe:viewJsonService(和xe:documentJsonService)与sessionAsSigner等效使用


如果我使用xe:customRestService并为doGet和doPost编写代码,我可以做到这一点,但我只是想知道是否有一种方法可以对内置服务执行同样的操作。

从源代码中我可以看出,很遗憾,没有,您不能:(

这些服务扩展了抽象类“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;
}
此“defaultSession”是在创建RestEngine时设置的,并使用dominUtils.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配置文件中

然后,可以在创建rest引擎时访问此属性

    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可能会更容易。

谢谢Cameron。正如您所说,customRestService可能是最简单的选择(至少在短期内)。扩展扩展扩展库可能是一个有趣的练习。这是一个遗憾,因为这是一个相当小/快速的修复,但如果您以前没有这样做,则需要花费相当多的精力。我甚至可能尝试修复它并向extlib项目提交拉取请求,但不幸的是,我之前从May发出的拉取请求仍然存在坐在那里,所以我不确定他们现在是否有足够的时间来更新extlib