![](/img/trans.png)
[英]Bundle not resolving while creating Mongodb OSGI Bundle using Amdatu
[英]Get osgi service reference from pure osgi bundle in Liferay portlet
我已經在apche felix中成功注冊了org.amdatu.mongo服務,如下所示,
捆綁軟件顯示在下面,導出處於活動/運行狀態的服務。
現在,我想在我的portlet中使用此服務,並且返回以下代碼,
package com.example.portlet;
import com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet;
import java.io.IOException;
import javax.portlet.Portlet;
import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import org.amdatu.mongo.MongoDBService;
import org.apache.felix.dm.annotation.api.ServiceDependency;
import org.osgi.service.component.annotations.Component;
@Component(
immediate = true,
property = {
"com.liferay.portlet.display-category=category.sample",
"com.liferay.portlet.instanceable=true",
"javax.portlet.display-name=loveworld Portlet",
"javax.portlet.init-param.template-path=/",
"javax.portlet.init-param.view-template=/view.jsp",
"javax.portlet.resource-bundle=content.Language",
"javax.portlet.security-role-ref=power-user,user"
},
service = Portlet.class
)
public class LoveworldmvcportletPortlet extends MVCPortlet {
@ServiceDependency
private volatile MongoDBService m_mongoDbService;
@Override
public void doView(RenderRequest renderRequest, RenderResponse renderResponse)
throws IOException, PortletException {
System.out.println( m_mongoDbService);//**getting NULL**
super.doView(renderRequest, renderResponse);
}
}
我已經嘗試過使用注解@ServiceDependency來獲取null了,我的mongoDb服務器運行正常!
我有如下的Menifest.mf文件,
Manifest-Version: 1.0
Bnd-LastModified: 1469380000381
Bundle-ManifestVersion: 2
Bundle-Name: loveworld
Bundle-SymbolicName: loveworld
Bundle-Version: 1.0.0
Created-By: 1.8.0_51 (Oracle Corporation)
Import-Package: com.liferay.portal.kernel.portlet.bridges.mvc;version=
"[1.0,2)",javax.portlet;version="[2.0,3)",javax.servlet,javax.servlet
.http,org.amdatu.mongo;version="1.0.0"
Javac-Debug: on
Javac-Deprecation: off
Javac-Encoding: UTF-8
Private-Package: com.example.portlet,content
Provide-Capability: osgi.service;objectClass:List<String>="javax.portl
et.Portlet",liferay.resource.bundle;bundle.symbolic.name=loveworld;re
source.bundle.base.name="content.Language"
Require-Capability: osgi.extender;filter:="(&(osgi.extender=jsp.taglib
)(uri=http://java.sun.com/portlet_2_0))",osgi.extender;filter:="(&(os
gi.extender=jsp.taglib)(uri=http://liferay.com/tld/aui))",osgi.extend
er;filter:="(&(osgi.extender=jsp.taglib)(uri=http://liferay.com/tld/p
ortlet))",osgi.extender;filter:="(&(osgi.extender=jsp.taglib)(uri=htt
p://liferay.com/tld/theme))",osgi.extender;filter:="(&(osgi.extender=
jsp.taglib)(uri=http://liferay.com/tld/ui))",osgi.ee;filter:="(&(osgi
.ee=JavaSE)(version=1.8))"
Service-Component: OSGI-INF/com.example.portlet.LoveworldmvcportletPor
tlet.xml
Tool: Bnd-3.2.0.201605172007
bnd.bnd文件如下,
Bundle-SymbolicName: loveworld
Bundle-Version: 1.0.0
Import-Package: com.liferay.portal.kernel.portlet.bridges.mvc;version="[1.0,2)",javax.portlet;version="[2.0,3)",javax.servlet,javax.servlet.http,org.amdatu.mongo;version="1.0.0"
使用該服務的Portlet如下所示,
您正在使用以下兩個注釋:
import org.apache.felix.dm.annotation.api.ServiceDependency;
import org.osgi.service.component.annotations.Component;
其中之一是用於聲明式服務組件的標准OSGi批注,另一種是來自Felix Dependency Manager項目的。 確保僅使用org.osgi.service.component.annotations包中的注釋。
另外,您應該在組件中添加一個綁定方法以用於服務引用。
第一個問題:捆綁軟件提供的服務的類型為ManagedServiceFactory
。 您正在嘗試注入MongoDBService
類型的服務。 這顯然不匹配。
第二個問題:您不應該自己嘗試直接使用ManagedServiceFactory
...它是Config Admin規范的一部分,並且只能由Config Admin本身使用。
第三個問題:正如Balazs指出的那樣,您正在使用來自以下不同框架的注釋:聲明性服務(DS)和依賴管理器(DM)。 這些不能混合在單個組件中...選擇一個!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.