2013-12-08 64 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',因爲該值將在運行時設置。 –