简体   繁体   English

在Liberty Profile下的OSGI中的Web Bundle中对Mongo db使用@Resource注入

[英]Using @Resource injection for Mongo db, inside Web Bundle inside OSGI, under Liberty Profile

I want to inject Mongo database (com.mongodb.DB) into OSGI Web Bundle Project, using @Resource. 我想使用@Resource将Mongo数据库(com.mongodb.DB)注入OSGI Web Bundle Project。

The application is to deployed to WebSphere Liberty Profile V8.5.5.1. 该应用程序将部署到WebSphere Liberty Profile V8.5.5.1。

Is this possible to do it? 这可能做到吗?

I got an error message "....The annotations could not be obtained because of the exception : java.lang.NoClassDefFoundError" 我收到错误消息“ ....由于异常而无法获取注释:java.lang.NoClassDefFoundError”

However, I can inject Mongo database into WAR, using @Resource, running on WebSphere Liberty Profile, if not using OSGI. 但是,如果不使用OSGI,我可以使用在WebSphere Liberty Profile上运行的@Resource将Mongo数据库注入WAR。

Below is lookup return null. 下面是查找返回null。

public static final DB getMongoDB() throws NamingException {
    InitialContext ic = new InitialContext();
    DB lookup = (DB) ic.lookup("java:comp/env/mongo/testdb");
    return lookup;
}

The web.xml is web.xml是

<resource-env-ref>
    <resource-env-ref-name>mongo/testdb</resource-env-ref-name>
    <resource-env-ref-type>com.mongodb.DB</resource-env-ref-type>
</resource-env-ref>

The server.xml is server.xml是

<!-- Enable features -->
<featureManager>
    <feature>jsp-2.2</feature>
    <feature>localConnector-1.0</feature>
    <feature>jaxrs-1.1</feature>
    <feature>wab-1.0</feature>
    <feature>ejbLite-3.1</feature>
    <feature>jpa-2.0</feature>
    <feature>jdbc-4.0</feature>
    <feature>cdi-1.0</feature>
    <feature>blueprint-1.0</feature>
    <feature>jndi-1.0</feature>
    <feature>servlet-3.0</feature>
    <feature>json-1.0</feature>
    <feature>mongodb-2.0</feature>
</featureManager>
<httpEndpoint host="localhost" httpPort="29080" httpsPort="29443" id="defaultHttpEndpoint"/>

<library id="MongoLib">
    <file name="${server.config.dir}/lib/mongo-java-driver-2.11.4.jar"/>
</library>
<mongo autoConnectRetry="false" id="mongo" libraryRef="MongoLib">
    <ports>27017</ports>
</mongo>
<mongoDB databaseName="test" id="mongo" jndiName="mongo/testdb" mongoRef="mongo">
</mongoDB>

<osgiApplication id="Test.osgi.jndi.app"
    location="Test.osgi.jndi.app.eba" name="Test.osgi.jndi.app">
    <classloader commonLibraryRef="MongoLib"></classloader>
</osgiApplication>

Alternatively, I tried to replace the JNDI lookup with below injection. 另外,我尝试用下面的注入替换JNDI查找。 The injected resource returns null. 注入的资源返回null。

public class MongoServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @Resource (name="mongo/testdb")
    protected DB db;
}

Here is the OSGI Manifest-Version 这是OSGI清单版本

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Test.osgi.jndi.web
Bundle-SymbolicName: Test.osgi.jndi.web
Bundle-Version: 1.0.0.qualifier
Bundle-ClassPath: WEB-INF/classes
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Web-ContextPath: /Test.osgi.jndi.web
Import-Package: com.mongodb,
 javax.el;version="2.0",
 javax.servlet;version="2.5",
 javax.servlet.annotation,
 javax.servlet.http;version="2.5",
 javax.servlet.jsp;version="2.0",
 javax.servlet.jsp.el;version="2.0",
 javax.servlet.jsp.tagext;version="2.0"
Bundle-Blueprint: OSGI-INF/blueprint/*.xml

The console: 控制台:

[AUDIT   ] CWWKZ0001I: Application apps started in 0.054 seconds.
[AUDIT   ] CWWKT0016I: Web application available (default_host): http://localhost:29080/Test.osgi.jndi.web/
[AUDIT   ] CWWKZ0001I: Application Test.osgi.jndi.app started in 0.561 seconds.
[AUDIT   ] CWWKF0015I: The server has the following interim fixes installed: PI09253.
[AUDIT   ] CWWKF0011I: The server defaultServer is ready to run a smarter planet.
[WARNING ] CWNEN0046W: The com.mongodb.DB type specified on the resource-ref, resource-env-ref, or message-destination-ref with the osgi:service/mongo/testdb name in the Test.osgi.jndi.web module could not be loaded. Compatibility type checking will not be performed for this resource reference.
[WARNING ] CWNEN0049W: Resource annotations on the methods of the com.osgi.jndi.web.MongoServlet class will be ignored. The annotations could not be obtained because of the exception : java.lang.NoClassDefFoundError: javax.naming.NamingException
[WARNING ] CWNEN0047W: Resource annotations on the fields of the com.osgi.jndi.web.MongoServlet class will be ignored. The annotations could not be obtained because of the exception : java.lang.NoClassDefFoundError: javax.naming.NamingException
    at java.lang.J9VMInternals.verifyImpl(Native Method)
    at java.lang.J9VMInternals.verify(J9VMInternals.java:94)
    at java.lang.J9VMInternals.prepare(J9VMInternals.java:516)
    at java.lang.Class.getDeclaredFields(Class.java:603)
    at com.ibm.wsspi.injectionengine.InjectionProcessor.getAllDeclaredFields(InjectionProcessor.java:549)
    at [internal classes]

I add Mongodb Java driver jar into Java Build Path Entry, inside Web Deployment Assembly. 我将Mongodb Java驱动程序jar添加到Web Deployment Assembly中的Java Build Path Entry中。 The java.lang.NoClassDefFoundError disappears. java.lang.NoClassDefFoundError消失。

However, the JNDI lookup returns new exception, "ClassCastException. I create new post for it. 但是,JNDI查找返回新的异常“ ClassCastException。我为此创建了新帖子。

ClassCastException during JNDI lookup for MongoDB, inside WAB, running Liberty 在WAB内运行Liberty的MongoDB的JNDI查找期间发生ClassCastException

I have got this error. 我有这个错误。 May be you define: Private MongoServlet mogoServlet; 可能是您定义的:私有MongoServlet mogoServlet; I don't know why but you try delete this code and replace by some different code. 我不知道为什么,但是您尝试删除此代码并替换为其他代码。 Maybe it will be ok. 也许会没事的。 It worked for me! 它为我工作!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM