2016-03-21 1 views
1

Ich benutze das XPages REST-Steuerelement, um auf Ressourcen in einer Datenbank zuzugreifen, die sich von der Datenbank unterscheidet, in der sich das REST-Steuerelement selbst befindet. Das ist einfach, ich benutze nur die databaseName Eigenschaft In SSJS möchte ich ein Handle auf die externe Datenbank (die eine in der Eigenschaft databaseName bezogen) und das scheint ziemlich herausfordernd sein In diesem speziellen Fall Ich benötige dieses Handle in einer Ansichtsspaltenformel, um auf Daten in einem übergeordneten Dokument zuzugreifen. Wenn es keine externe Datenbank gab, würde ich einfach die globale Datenbankeigenschaft verwenden, aber das wird in diesem Fall nicht funktionieren, da es auf die Datenbank verweist, die das REST-Steuerelement hostet.XPages REST-Kontrolle. Wie bekomme ich ein Handle zur externen Datenbank?

+1

Nicht sicher, ob dies hilft, aber so stelle ich eine Verbindung zu einer externen Datenbank in Bluemix her, um einen durchsuchbaren REST-Service zu erstellen - http://xomino.com/2015/11/27/xpages-in-bluemix-creating-a-searchable -rest-service/ – MarkyRoden

+1

speichern Sie diesen externen Datenbanknamen in der Datei xsp.properties oder in einer eigenen Eigenschaftendatei. So kann die gesamte Anwendung von diesem Parameter profitieren –

Antwort

1

Ich empfehle, was Frank van der Linden in den Kommentaren empfohlen, um es als eine xsp-Eigenschaft, die leicht durch eine Eigenschaft getting Methode/Funktion, die Sie verwenden können, und hat den schönen Nebeneffekt der Erstellung Ihrer Daten Verbindungsaufruf kann leicht zwischen Anwendungen kopiert/eingefügt werden.

Beispiel:

ich die data property name stored as an xsp property haben, in <app>/WebContent/WEB-INF/xsp.properties:

xsp.local.data=MyApp_data.nsf 

ich passieren a managed bean to perform the app config Arbeit verwenden:

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

Das bedeutet, dass my AppUtil bean die Eigenschaft auf den db Pfad setzt :

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

* Anmerkung: die erste Parameter ist der Name der Eigenschaft, die zweite ist die ‚default‘ (Fail-Over) Wert, falls es nicht den Wert der Eigenschaft

dann den vollständigen Pfad ziehen findet für Ihre xe: restService, alles was Sie brauchen würde, ist in den Werten schieben zu tun, wie so (den gleichen Server unter der Annahme, Beispiel zeigt eine xe: viewJsonService mit Standardspalten):

<?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> 

[Update ]

Wie Sven Hasselbach in den folgenden Kommentaren hervorhebt, würde eine verwaltete Eigenschaft ungefähr das gleiche Ergebnis erzielen, ohne die xsp-Eigenschaftendatei zu bearbeiten und die Eigenschaft (die für die Anwendung explizit ist) in die Definition der verwalteten Bean einfließen lässt. Entnommen aus seiner Antwort auf XPages managed beans and scoped variables, hier ist ein Beispiel dafür, wie Sven macht das gleiche, eine verwaltete Eigenschaft mit:

in 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> 

In seiner Config-Bohne, es ist wie jede Eigenschaft definiert (a la POJO) , mit dem Privateigentum und öffentlichen Getter/Setter:

//... 
private String dbName; 

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

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

Nutzbare wie jede verwaltete Bean-Eigenschaft:

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

+1

Warum nicht stattdessen eine verwaltete Eigenschaft verwenden? –

+0

Das wäre eine ziemlich gute Verwendung, besonders da dieses Beispiel sich nur auf eine Eigenschaft konzentriert und eine großartige Möglichkeit ist, der Eigenschaft einer verwalteten Bean einen 'statischen finalen' Wert hinzuzufügen. Ich habe es meiner Antwort hinzugefügt. –

+0

Danke, bitte sehen Sie meine eigene Antwort auf die Frage unten. Vielleicht war es in der ursprünglichen Frage nicht klar, aber meine Bedenken waren mehr darüber, wie man das db-Objekt selbst behandelt, nicht den Pfad zur db –

1

In meiner ursprünglichen Frage wurde nicht darauf hingewiesen, aber ich habe ein Config-Servlet, das den Pfad zur externen Datenbank definiert.

Die Frage war mehr über eine Handle auf das Datenbankobjekt in einer Weise, die nicht zu viel Aufwand zu schaffen. Nach einem Gespräch mit Paul Winters im Slack (OpenNTF channel) gestern bin ich zuversichtlich, dass das Öffnen der externen db in einer View-Spalte vollkommen in Ordnung ist.

eher für einen Griff an die externe Quelle innerhalb des Dienstes als suchen, habe ich einfach den db in Code öffnen, wenn mein Code für die endgültige Lösung neededSo läuft darauf hinaus, ein paar einfachen Codezeilen nach unten:

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

Verwandte Themen