【问题标题】:XPages REST-Control. How to get a handle to external databaseXPages REST 控制。如何获取外部数据库的句柄
【发布时间】:2020-01-28 02:06:18
【问题描述】:

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

【问题讨论】:

  • 不确定这是否有帮助,但这是我连接到 Bluemix 中的外部数据库以创建可搜索 REST 服务的方式 - xomino.com/2015/11/27/…
  • 将此外部数据库名称存储在 xsp.properties 或自己的属性文件中。所以整个应用程序都可以从这个参数中受益

标签: xpages xpages-ssjs xpages-extlib


【解决方案1】:

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

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

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

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");

【讨论】:

    【解决方案2】:

    我强烈推荐 Frank van der Linden 在 cmets 中推荐的内容,将其设置为 xsp 属性,您使用的任何属性获取方法/函数都可以轻松引用该属性,并且具有建立数据连接的良好副作用调用很容易在应用程序之间复制/粘贴。

    例子:

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

    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")
    

    *注意:第一个参数是属性名称,第二个参数是“默认”(故障转移)值,以防找不到该属性的值

    然后,要为您的 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 在下面的 cmets 中指出的那样,托管属性将获得大致相同的结果,而无需编辑 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 中,它被定义为任何属性(a 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}" />
    

    [/更新]

    【讨论】:

    • 这将是一个很好的用途,特别是因为这个例子只关注一个属性,它是向托管 bean 的属性注入 static final 值的好方法。我已将其添加到我的答案中。
    • 谢谢,请看我自己对以下问题的回答。也许最初的问题并不清楚,但我更关心的是如何处理 db-object 本身,而不是 db 的路径
    • @GunnarAlmas 啊,是的,这和我以为你要找的有点不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2010-11-19
    • 2014-11-03
    • 2014-05-22
    • 1970-01-01
    相关资源
    最近更新 更多