当前位置: 首页 > 知识库问答 >
问题:

将Apache Felix SCR更新为OSGi声明性服务R6-@属性

濮嘉茂
2023-03-14

我正在从ApacheFelixSCR注释更新到OSGiDSR6注释,而引起我更多问题的是类中的@Property。

在我之前:

@Component (immediate = true)
@Service (A.class)
public class AImpl implements A
{
    @Property (intValue = 604800)
    public static final String A = "a";
    ...
}

现在我有:

@Component (service = A.class, immediate = true)
@Designate (ocd = Configuration.class)
public class AImpl implements A
{
    ...
}

@ObjectClassDefinition (name = "Bla")
public @interface Configuration
{
    @AttributeDefinition (name = "A", type = AttributeType.INTEGER)
    int A() default 604800;
}

这一切中最奇怪的事情是:

以前,我可以将我的AImpl类视为组件。

现在,我无法将我的AImpl类视为组件,并且由于不满意的引用,使用它的每个人都无法启动。

为什么像这样改变配置会导致这种行为?也许我错过了什么?

更奇怪的是,我的xml在. jar里面,看起来还可以。scr: info给我带来了空指针异常,我看不到我的组件,这意味着scr: list对任何事情都没有帮助。

XML BELLOW:

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.3.0" name="AImpl" immediate="true" activate="init" deactivate="stop">
  <implementation class="AImpl"/>
  <service>
    <provide interface="A"/>
  </service>
  <reference name="Bla1" interface="Bla1Service" bind="bindBla1Service" unbind="unbindBla1Service"/>
  <property name="PROP.EVENT.INTERVAL" type="Long" value="900000"/>
</scr:component>

注:这些类都有奇怪的名字等等,因为它们来自一家私人公司。

堆栈跟踪:

2017-12-11T16:40:27.689 0100[框架事件调度器]错误o.o.p.l.l。内部的FrameworkHandler:144 frameworkEvent frameworkEvent错误-组织。阿帕奇。费利克斯。scr组织。奥斯基。框架BundleException:激活器组织。阿帕奇。费利克斯。scr。impl。捆绑组织的激活器。阿帕奇。费利克斯。scr在组织中无效。日食奥斯基。框架内部的果心抽象包。loadBundleActivator(AbstractBundle.java:172)位于org。日食奥斯基。框架内部的果心BundleContextImpl。在org上启动(BundleContextImpl.java:679)。日食奥斯基。框架内部的果心BundleHost。startWorker(BundleHost.java:381)位于org。日食奥斯基。框架内部的果心抽象包。org上的updateWorker(AbstractBundle.java:645)。日食奥斯基。框架内部的果心抽象包。更新(AbstractBundle.java:592),网址为org。阿帕奇。费利克斯。网络控制台。内部的果心更新帮助。doRun(UpdateHelper.java:60)位于org。阿帕奇。费利克斯。网络控制台。内部的果心BaseUpdateInstallHelper。doRun(BaseUpdateInstallHelper.java:93)位于org。阿帕奇。费利克斯。网络控制台。内部的果心更新帮助。doRun(UpdateHelper.java:70)位于org。阿帕奇。费利克斯。网络控制台。内部的果心BaseUpdateInstallHelper。在java上运行(BaseUpdateInstallHelper.java:123)。朗。丝线。运行(Thread.java:748)的原因是:java。lang.ClassCastException:org。阿帕奇。费利克斯。scr。impl。不能将激活器强制转换为组织。奥斯基。框架组织的BundleActivator。日食奥斯基。框架内部的果心抽象包。loadBundleActivator(AbstractBundle.java:167)。。。省略9个公共框架

在karaf上安装我的包的POM. XML的一部分:

<artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-kar-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <inherited>false</inherited>
                        <configuration>
                            <includeScope>runtime</includeScope>
                            <prependGroupId>true</prependGroupId>
                            <excludeTransitive>true</excludeTransitive>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>org.osgi</groupId>
                                    <artifactId>org.osgi.framework</artifactId>
                                    <version>${org.osgi.framework.version}</version>
                                </artifactItem>
                                <artifactItem>
                                    <groupId>org.osgi</groupId>
                                    <artifactId>org.osgi.core</artifactId>
                                    <version>${org.osgi.core.version}</version>
                                </artifactItem>
                                <artifactItem>
                                    <groupId>org.apache.felix</groupId>
                                    <artifactId>org.apache.felix.scr</artifactId>
                                    <version>${org.apache.felix.scr.version}</version>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
</execution>
</executions>

共有2个答案

酆高翰
2023-03-14

您的AImpl类仍然是一个组件。但是,现在它是一个“配置”组件,因此它有一个链接到属性类的@ObjectClassDefinition注释。

转到配置选项卡,您应该会看到您的组件及其属性。

白宏义
2023-03-14

这部分看起来像错误:service=AImpl.class。您的组件应该使用其接口A作为服务发布,而不是使用实现类。

这通常是隐式的,因为组件直接实现接口A,但您已经覆盖了接口A。

解决方案应该是简单地删除service=AImpl。从@组件注释中初始化属性。

 类似资料:
  • 我正在将ApacheFelixSCR注释迁移到OSGI声明性服务[AEM]。在迁移过程中,我无法在DS中找到基数的精确替换。 现有的SCR实施: 现在它在OSGi声明性服务中迁移如下 在DS注释实现中,我必须映射@Property中存在的参数基数。请推荐我

  • 问题内容: 如何通过属性区分已发布的OSGI服务,这些服务实现了相同的接口? 问题答案: 假设您要基于属性的某些值来检索注册的服务,则需要使用 过滤器 (基于LDAP语法)。 例如: 您想在其中查找实现且属性值等于的服务。 这是获取参考的相关javadoc。 备注1: 上面的示例和javadoc引用了发行版4.2。如果您不限于J2SE 1.4运行时,建议您看一下Release 4.3 语法,您可以

  • 我正在尝试测试一个用Declaratice Services注释()注释的OSGi服务。我已经根据AEM多项目示例生成了我的项目。 每当我在IntelliJ中运行此测试时,OSGi Mock都会抱怨测试类中缺少SCR元数据。 这是否意味着我只能测试带有ApacheFelix附带的旧SCR注释的类?OSGi模拟的文档表明2.0版支持声明性服务注释。0及以上。我使用的版本符合此标准。

  • 问题内容: 如何将类属性声明为对象? 我试过了: 但这没有用。另外,为什么要那样做呢? 只实例化该对象并使用其成员不是更好吗? 问题答案: 从有关类属性的PHP手册(重点是我的): 类成员变量称为“属性”。您可能还会看到使用其他术语(例如“属性”或“字段”)来引用它们,但是出于参考目的,我们将使用“属性”。它们是使用关键字public,protected或private之一定义的,后跟普通变量声明

  • 我正在从Felix SCR注释迁移到R6 OSGI声明性服务,但该服务未在karaf中列出。根据下面的代码示例,ServiceImpl应该列出的是karaf。但它没有上市。是否有任何其他配置,我必须在pom。xml? 这是我正在使用的pom.xml。

  • 创建服务接口,接口必须继承IService。 注意:在异步编程里,异步转同步调用是非常糟糕的,并且有可能死锁。为了避免这个问题,Uragano不支持同步方法,所有的服务方法必须是异步的。 [ServiceDiscoveryName("RPC")] [ServiceRoute("hello")] public interface IHelloService : IService { [Ser