JNDI查找MongoDB的,里面WAB期间抛出ClassCastException,自由运行(Cl

2019-10-19 14:02发布

我想使用JNDI查找MongoDB的,WAB / OSGi的内部,运行Liberty配置文件。

import com.mongodb.DB;

@WebServlet("/MongoServlet")
public class MongoServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;  

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        try {
            DB db = (DB) new InitialContext().lookup("java:comp/env/mongodb");
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }
}

JNDI查找给出以下例外。

[ERROR   ] SRVE0777E: Exception thrown by application class 'com.osgi.jndi.web.MongoServlet.doGet:57'
java.lang.ClassCastException: com.mongodb.DBApiLayer incompatible with com.mongodb.DB
com.mongodb.DBApiLayer is subclass of com.mongodb.DB. 

我相信ClassCastException异常是因为不同类加载器正在使用我的应用程序,和OSGi bootclassloader。 但是,我不知道如何解决它。

Answer 1:

目前还没有办法用mongodb-2.0功能与OSGi应用程序。

找了一个com.mongodb.DB资源将返回你回来的实例DBApiLayer ,但是这不是问题(因为DBApiLayer延伸DB )。 你仍然会得到即使你没有这样一个ClassCastException:

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

会抛出:

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

这样做的原因限制是mongodb-2.0功能会使用一个ClassLoader从自由加载com.mongodb类,一个OSGi应用程序将使用一个单独的类加载器加载com.mongodb类,不管你如何配置的东西。

普通的Java EE应用程序可以做这样的事情:

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

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

然而, <osgiApplication>元素不具备这种能力。 不幸的是,这里唯一的解决办法是打开与IBM RFE(或给予好评的,如果一个RFE已经存在此)。



文章来源: ClassCastException during JNDI lookup for MongoDB, inside WAB, running Liberty