我想注入Mongo的数据库(com.mongodb.DB)到OSGI网络打捆项目,使用@Resource。
该应用是部署到WebSphere自由简介V8.5.5.1。
这是可能做到的呢?
我得到一个错误消息“......因为异常的注解无法获得:java.lang.NoClassDefFoundError”
不过,我可以注入Mongo的数据库陷入战争,使用@Resource,在WebSphere上自由运行的配置文件,如果不使用OSGi。
下面是查找返回NULL。
public static final DB getMongoDB() throws NamingException {
InitialContext ic = new InitialContext();
DB lookup = (DB) ic.lookup("java:comp/env/mongo/testdb");
return lookup;
}
在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>
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>
另外,我试图替换下面注入JNDI查找。 注入的资源返回null。
public class MongoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Resource (name="mongo/testdb")
protected DB db;
}
这里是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
控制台:
[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]