3

我在这方面完全是新手,所以我提前道歉。我正在尝试创建一个 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 字符串的“欢迎”文本。

4

3 回答 3

6

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

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

然后,您必须访问该服务。您似乎正在使用的 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 规范。它可以免费下载并详细解释所有内容。

于 2013-04-03T03:43:15.250 回答
2

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

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

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

然后,html.esp脚本使用 sling.getService 获取服务:

var loader = sling.getService(Packages.org.apache.sling.samples.webloader.Webloader);
于 2013-04-03T06:51:15.810 回答
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( "welcome.message" )

于 2016-02-19T10:38:34.170 回答