MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

ClassCastException während der JNDI-Suche nach MongoDB innerhalb von WAB, während Liberty ausgeführt wird

Derzeit gibt es keine Möglichkeit, mongodb-2.0 zu verwenden Funktion mit einer OSGi-Anwendung.

Nachschlagen einer com.mongodb.DB Die Ressource gibt Ihnen eine Instanz von DBApiLayer zurück , aber das ist nicht das Problem (da DBApiLayer erweitert DB ). Sie würden immer noch eine ClassCastException erhalten, selbst wenn Sie Folgendes tun würden:

DBApiLayer db = (DBApiLayer) new InitialContext().lookup("java:comp/env/mongodb");

Würde werfen:

java.lang.ClassCastException: com.mongodb.DBApiLayer incompatible with com.mongodb.DBApiLayer

Der Grund für diese Einschränkung ist, dass mongodb-2.0 Das Feature verwendet einen Classloader von Liberty, um com.mongodb-Klassen zu laden, und eine OSGi-Anwendung verwendet einen separaten Classloader, um com.mongodb-Klassen zu laden, unabhängig davon, wie Sie die Dinge konfigurieren.

Normale Java-EE-Anwendungen können Dinge wie diese tun:

<library id="MongoLib">
    <file name="${server.config.dir}/lib/mongo-java-driver-2.11.4.jar"/>
</library>

<application name="myApp">
    <classloader commonLibraryRef="MongoLib"/>
</application>

Allerdings <osgiApplication> Elemente haben diese Fähigkeit nicht. Leider besteht hier die einzige Lösung darin, ein RFE bei IBM zu eröffnen (oder ein Upvote, wenn es dafür bereits ein RFE gibt).