我想在WAB/OSGi中使用MongoDB的JNDI lookup,运行Liberty Profile。
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引导类加载器。但是,我不知道如何解决这个问题。
发布于 2015-12-22 10:12:49
目前还没有办法在OSGi应用程序中使用mongodb-2.0功能。
查找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特性将使用Liberty中的类加载器来加载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,则上选一个)。
https://stackoverflow.com/questions/22447446
复制相似问题