OSGi组件可通过Apache Felix进行配置

时间:2013-04-02 21:41:13

标签: java maven osgi apache-felix sling

我是一个完整的新手,所以我提前道歉。我正在努力创造 一个OSGi组件,它只显示一个hello world消息,并可通过felix的输入进行配置。然后在jsp页面上吐出来。我正在使用scr注释来帮助完成此操作。这是我的java代码

package com.training.cq5.trainingApp;

import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.osgi.service.component.ComponentContext;
import org.apache.sling.commons.osgi.PropertiesUtil;

@Component(label= "Welcome Message",
        description = "Welcome Message for the training excercise",
        immediate = true, enabled = true, metatype=true)
@Properties({
    @Property(name = "welcome.message", value = "WelcomeMessage")
})
@Service(WelcomeMessage.class)
public class WelcomeMessage {

    private static String welcome_message = "Welcome";

    @Activate
    protected void activate(ComponentContext ctx) {
        welcome_message = PropertiesUtil.toString(ctx.getProperties().get(welcome_message), welcome_message);
    }

    public static String getMessage() { 
        return welcome_message;
    }
}

以下是我在JSP中调用它:

<%@ page import="com.training.cq5.trainingApp.WelcomeMessage" %>

<h2><%= WelcomeMessage.getMessage() %></h2>

有什么理由说它没有从felix更新?我得到的只是“欢迎” 来自welcome_message字符串的文本。

3 个答案:

答案 0 :(得分:6)

您正在访问WelcomeMessage.getMessage()作为静态方法,但您想要的是实际服务。当您使用@Service和@Component批注对类进行批注时,您向OSGI框架指明您希望将此类的实例注册为服务。此服务实例由OSGI框架管理,在其生命周期(实例化时)或通过类加载器加载适当的类。

但是,为了使用@Component和@Service注释,您必须使用Apache Felix SCR plugin。一旦有效,您的服务将被实例化。

然后你必须访问该服务。您似乎正在使用的Sling中最简单的方法是SlingScriptHelper.getService(),它允许您查找服务。

<强>更新

在OSGI中,服务按其类型注册。当您使用@Service(MyClass.class)声明服务时,该服务将在MyClass类型下注册。要检索它,您将在服务注册表中查询给定类型的服务。在Java代码中,您将使用getServiceReference(Class clazz) / getService(ServiceReference reference) @Reference注释。

在Sling系统的JSP中,您可以使用SlingScriptHelper,如前所述。这是一个简短的代码示例(假设正确的导入):

<%
SlingBindings bindings = (SlingBindings) req.getAttribute(SlingBindings.class.getName());
SlingScriptHelper scriptHelper = bindings.getSling();
MyService service = scriptHelper.getService(MyService.class);
// ... do stuff with service.
%>

如果您打算更多地使用OSGI,我强烈推荐OSGI specification。它可以免费下载并详细解释所有内容。

答案 1 :(得分:2)

ilikeorangutans是正确的,你不需要在OSGi服务上使用静态方法 - 这个想法是服务实现一个接口,客户端从它们的OSGi上下文中检索它并通过它的服务接口使用它。

Apache Sling webloader sample使用此技术在其请求处理脚本中访问Webloader服务。在这种情况下,脚本是ESP(服务器端javascript),但原则与JSP完全相同。

服务接口在Webloader.java中定义,WebLoaderImpl.java将其实现为OSGi服务。

然后,html.esp脚本使用sling.getService:

获取服务
var loader = sling.getService(Packages.org.apache.sling.samples.webloader.Webloader);

答案 2 :(得分:0)

更改此行: -  welcome_message = PropertiesUtil.toString(ctx.getProperties().get(welcome_message), welcome_message);

welcome_message = PropertiesUtil.toString(ctx.getProperties().get("welcome.message"), welcome_message);

注意区别:-ctx.getProperties()。get( welcome_message )vs ctx.getProperties()。get(&#34; welcome.message&#34;