xe:viewJsonService 和 sessionAsSigner

xe:viewJsonService and sessionAsSigner

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

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

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

这些服务扩展了摘要 class '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的时候设置的,使用了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());
        }

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

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