XPage REST-Control。如何获取外部数据库的句柄

时间:2016-03-21 06:41:37

标签: xpages xpages-ssjs xpages-extlib

我正在使用XPage REST控件来访问数据库中的资源,该数据库与REST控件本身所在的db不同。这很简单,我只是使用 databaseName 属性 在SSJS中,我想获得外部数据库(在databaseName属性中引用的那个)的句柄,这似乎相当具有挑战性 在这种特殊情况下,我需要在视图列公式中使用该句柄来访问父文档上的数据。如果没有涉及外部数据库,我只会使用全局数据库属性,但在这种情况下这不起作用,因为它指向承载REST控件的数据库。

2 个答案:

答案 0 :(得分:1)

我强烈推荐Frank van der Linden在评论中推荐的内容,将其设置为xsp属性,可以通过您使用的属性获取方法/函数轻松引用,并且具有使您的数据连接具有良好的副作用呼叫可以在应用程序之间轻松复制/粘贴。

示例:

我在<app>/WebContent/WEB-INF/xsp.properties中有data property name stored as an xsp property

xsp.local.data=MyApp_data.nsf

我碰巧使用a managed bean to perform the app config工作:

<managed-bean>
  <managed-bean-name>confBean</managed-bean-name>
  <managed-bean-scope>application</managed-bean-scope>
  <managed-bean-class>com.myApp.config.AppUtil</managed-bean-class>
</managed-bean>

这意味着我的AppUtil bean将属性设置为db路径:

ExtLibUtil.getXspContext().getProperty("xsp.local.data", "MyApp_data.nsf")

*注意:第一个参数是属性名称,第二个参数是&#39;默认&#39; (故障转移)价值,如果它没有找到财产的价值

然后为了获取 xe:restService 的完整路径,您需要做的就是推送值,就像这样(假设相同的服务器,示例显示 xe: viewJsonService ,默认列:)

<?xml version="1.0" encoding="UTF-8"?>
<xp:view
    xmlns:xp="http://www.ibm.com/xsp/core"
    xmlns:xe="http://www.ibm.com/xsp/coreex">
    <xe:restService
        id="restService1"
        pathInfo="data">
        <xe:this.service>
            <xe:viewJsonService
                databaseName="#{confBean.dbAppPath}"
                viewName="SomeView"
                defaultColumns="true" />
        </xe:this.service>
    </xe:restService>
</xp:view>

[更新]

正如Sven Hasselbach在下面的评论中指出的那样,托管属性可以实现大致相同的结果,而无需编辑xsp属性文件并保持与托管bean定义内联的属性(对应用程序是显式的)。取自他对XPages managed beans and scoped variables的回答,这里有一个关于Sven如何使用托管属性做同样事情的例子:

faces-config.xml

中的

<managed-bean>
    <managed-bean-name>myBean</managed-bean-name>
    <managed-bean-class>ch.hasselba.xpages.MyBean</managed-bean-class>
    <managed-bean-scope>application</managed-bean-scope>

    <managed-property>
        <property-name>dbName</property-name>
        <value>MyName</value>
        <property-class>java.lang.String</property-class>
    </managed-property>
</managed-bean>

在他的配置bean中,它被定义为任何属性(la POJO),具有私有属性和公共getter / setter:

//...
private String dbName;

public void setDbName(String dbName) {
    this.dbName = dbName;
}

public String getDbName() {
    return dbName;
}
//...

可以像任何托管bean属性一样使用:

<xp:text
    value="#{myBean.dbName}" />

[/更新]

答案 1 :(得分:1)

在我原来的问题中没有指出,但我确实有一个config-servlet,它定义了外部数据库的路径。

问题更多的是以不会产生太多开销的方式获取数据库对象的句柄。昨天与Paul Winters在slack(OpenNTF频道)讨论后,我现在确信在视图列中打开外部数据库是完全可以的。

不是在服务中寻找外部源的句柄,而是在需要时只需在代码中打开数据库。因此,我的最终解决方案的代码归结为几行简单的代码:

var pid = rowData.getColumnValue("r_companyid"); var path = configBean.getDbPath( no.mycompany.myapp.Configuration.DB_PATH_CONTACTS ); var contactsDb:NotesDatabase = session.getDatabase(database.getServer(), path); var docParent:NotesDocument = contactsDb.getDocumentByUNID(pid); retVal = docParent.getItemValueString("CompanyName");