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 可能会更容易。
是否可以将 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 可能会更容易。