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