sql >> Base de Datos >  >> NoSQL >> MongoDB

ClassCastException durante la búsqueda JNDI para MongoDB, dentro de WAB, ejecutando Liberty

Actualmente no hay forma de usar mongodb-2.0 característica con una aplicación OSGi.

Buscando un com.mongodb.DB resource le devolverá una instancia de DBApiLayer , pero ese no es el problema (ya que DBApiLayer extiende DB ). Todavía obtendría una ClassCastException incluso si hiciera esto:

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

Lanzaría:

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

El motivo de esta limitación es que mongodb-2.0 La función utilizará un Classloader de Liberty para cargar clases com.mongodb, y una aplicación OSGi utilizará un Classloader independiente para cargar clases com.mongodb, sin importar cómo configure las cosas.

Las aplicaciones Java EE normales pueden hacer cosas como esta:

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

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

Sin embargo, <osgiApplication> elementos no tienen esa capacidad. Desafortunadamente, la única solución aquí es abrir un RFE con IBM (o votar a favor uno si ya existe un RFE para esto).