簡體   English   中英

從Liferay Portlet中的純osgi軟件包獲取osgi服務參考

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM