Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OSGi组件可通过ApacheFelix配置_Java_Maven_Osgi_Apache Felix_Sling - Fatal编程技术网

Java OSGi组件可通过ApacheFelix配置

Java OSGi组件可通过ApacheFelix配置,java,maven,osgi,apache-felix,sling,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; impo

我是个新手,所以我提前道歉。我正在努力创造 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没有更新有什么原因吗?我得到的只是“欢迎”
欢迎消息字符串中的文本。

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

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

那么你就必须访问该服务。在Sling中,您似乎正在使用的最简单的方法是让您查找服务

更新

在OSGI中,服务是按类型注册的。当您使用@service(MyClass.class)声明服务时,该服务将在MyClass类型下注册。要检索它,您需要在服务注册表中查询给定类型的服务。在Java代码中,您将使用注释中的/或

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



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

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

ApacheSling使用此技术在其请求处理脚本中访问Webloader服务。在本例中,脚本是ESP(服务器端javascript),但其原理与JSP完全相同

服务接口在中定义,并作为OSGi服务实现

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

var loader = sling.getService(Packages.org.apache.sling.samples.webloader.Webloader);
更改此行:-
welcome\u message=PropertiesUtil.toString(ctx.getProperties().get(welcome\u message),welcome\u message)

welcome\u message=PropertiesUtil.toString(ctx.getProperties().get(“welcome.message”),welcome\u message)


注意区别:-ctx.getProperties().get(欢迎消息)与ctx.getProperties().get(“欢迎消息”

谢谢@bertrand!这个概念有道理,但我有点困惑。我在webloader示例中没有看到esp脚本。但是在esp中,我假设您使用sling.getService,然后在我的例子中调用loader.getMessage()。抱歉,这里有点生疏,我需要在jsp文件中做的就是让它工作,或者我的java代码需要一些修改。对我的代码的任何修改都将不胜感激。谢谢你的帮助!与此同时,我在一个Sling测试脚本中找到了一个示例,您可以看看它是如何使用ConfigurationAdmin服务的,并对Welcome服务执行类似的操作。您需要创建一个描述该服务契约的java接口,并像我前面提到的Webloader和WebLoaderImpl一样创建一个实现。我确实安装了ApacheFelixSCR插件,并且可以正常工作。那么我的问题就在于通过sling访问它?对不起,我是个彻头彻尾的新手。对我的代码的任何修改都将不胜感激。或者任何代码示例都会有很大帮助。谢谢谢谢@ILIKE猩猩。知道我为什么在添加JSP时出现这个错误吗。SlingBindings无法解析为类型您在页面中缺少适当的导入:谢谢@ilikeorangutans,但由于某些原因,现在我收到一个不同的错误复制局部变量绑定有什么想法吗?感谢您的帮助,我对这一点还很陌生,并且仍在学习这意味着绑定已经定义好了。你可以跳过第一行。
var loader = sling.getService(Packages.org.apache.sling.samples.webloader.Webloader);