2013-12-08 65 views
0

我试图使用@Reference费利克斯SCR标注在斯卡拉使用Apache费利克斯SCR Annoration @Reference在Scala中,对OSGi环境

这是怎么回事可以在Java中使用:

public class Foo { 

    @Reference 
    MyServiceInterface service; 
    // some code here 
} 

这里,为MyService是最好的Java接口,而不是一个具体的类(依赖注入)

我使用Scala中相同的注解,试图依赖于同为MyService(Java接口),如:

class Foo { 
    @Reference 
    val service = MyServiceInterface // ?? 
    // some code here 
} 

如何在Scala中使用此注释来引用Java接口?

例如:

@Reference 
val MyServiceInterface service 

@Reference 
val service = MyServiceInterface 

无效Scala代码

谢谢

回答

0

我能够通过正确指定变量的类型等,以解决这个问题的用途:

@Reference 
var service: MyServiceInterface = null 

@Neil是正确的,我们必须使用,而不是VAL为VAR服务绑定发生在运行时。

其次,我不得不以下配置添加到行家-SCR-插件:

<configuration> 
    <scanClasses>true</scanClasses> 
</configuration> 

然后,我不得不特别指示的Maven捆绑插件如下到NOT导入org.apache.felix.scr.annotations包:

<Import-Package>!org.apache.felix.scr.annotations, *</Import-Package> 

因为清单否则会将该包的条目包含为包依赖的内容。

完成此操作后,mvn-scr-plugin将正确生成XML文件,并且mvn-bundle-plugin将生成包,并正确显示。

+1

它*不应该从导入中移除注释包,因为它们的保留策略是“class”,即它们不在运行时使用。我相信在Scala编译器中有一个已知的错误,它会错误地处理保留策略。 –

+0

@NeilBartlett你是对的。我正在使用Scala 2.10.3。该错误似乎尚未修复。 – zeiger

1

我还不是很了解斯卡拉,但我相信 “VAL” 指不可变的价值,因此把它绑定到一个(可变的)服务参考是没有意义的伦斯。

该成员字段不应该用“def”或“var”声明吗?在这种情况下,注释将被允许。

+0

你是对的,我已经发布了这个在我的解决方案 – zeiger

0

引用注释具有interfaceReference属性。 该属性可用于指定java界面。

我在斯卡拉认为它看起来像(从来没有使用过菲利克斯诠释 - 斯卡拉):

@Reference(interfaceReference = MyServiceInterface) 
val MyServiceInterface service 

这可能是你还必须指定在这种情况下,绑定和取消绑定方法。 请参见Felix Annotations documentation

由于1.9.0 Felix注释是运行时注释。注释费利克斯处理器有一个选项scanClasses使用类而不是源代码来处理注释。这对Groovy来说工作得很好。我没有看到为什么这不适用于Scala。

如果您使用Intellij,那么请查看Felix Annotation Plugin。该插件默认扫描类

+0

尼尔是正确的,你必须使用'var',因为该值将在运行时设置。 –