2013-04-02 51 views
3

我是一个完整的newb,所以我提前致歉。我正在尝试创建一个OSGi组件,该组件只显示hello world消息,并可通过felix的输入进行配置。然后吐出一个jsp页面。我正在使用scr注释来帮助做到这一点。这是我的Java代码OSGi组件可通过Apache Felix配置

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> 

是否有任何理由为什么它不从菲利克斯更新?我所得到的是welcome_message字符串中的“Welcome” 文本。

回答

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。免费下载并详细解释所有内容。

+0

T hanks @ilikeorangutans。我确实安装并运行了Apache Felix SCR插件。那么我的问题就在于通过吊索访问它?对不起,我是一个完整的,我的意思是完整的newb在这里。任何修改我的代码将不胜感激。或者任何代码示例都会有很大帮助。谢谢! –

+0

谢谢@ilikeorangutans。任何想法为什么我在添加你的JSP时遇到这个错误。 ** SlingBindings无法解析为类型** –

+0

您错过了您网页中的相应导入:<%@ page import =“org.apache.sling.api.scripting.SlingBindings”%> – ilikeorangutans

2

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

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

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

然后,html.esp脚本使用吊索获取服务。的getService:

var loader = sling.getService(Packages.org.apache.sling.samples.webloader.Webloader); 
+0

谢谢@bertrand!这个概念是有道理的,但我有点困惑。我在webloader示例中看不到esp脚本。但是在esp中,我假设你使用sling.getService,然后在我的情况下调用loader.getMessage()。对不起,这里有一个newb,就是我必须在我的jsp文件中执行这个操作,或者我的java代码需要修改。任何修改我的代码将不胜感激。谢谢您的帮助! –

+0

与此同时,我在Sling测试脚本中找到一个示例http://svn.apache.org/repos/asf/sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/serverscripts/ jsp-engine-setup.jsp - 你可以看看它是如何使用ConfigurationAdmin服务的,并且用你的WelcomeService做类似的事情。您需要创建一个描述该服务契约的java接口,并使用前面提到的Webloader和WebLoaderImpl创建一个实现。 –

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()得到(WELCOME_MESSAGE)VS ctx.getProperties。 ().get(“welcome.message”