2010-05-16 43 views
9

我試圖用Scala 2.8實現JavaEE會話Bean。
因爲它是一個遠程會話Bean,我有以下的Java註解進行註解:斯卡拉2.8:使用Java註釋與數組參數

@Target({ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Remote { 
    Class[] value() default {}; 
} 

我只找到this example斯卡拉2.7。 在斯卡拉2.7,它可以定義會話bean是這樣的:

@Remote {val value = Array(classOf[MyEJBRemote])} 
class MyEJB 
... 

我如何使用此批註的相同方式使用Scala 2.8?我已經嘗試了很多不同的版本,所有結果都是「註釋參數需要是常量」,「非法開始簡單表達」。 所有這些定義不工作:

@Remote{val value = Array(classOf[MyEJBRemote])} 
@Remote(val value = Array(classOf[MyEJBRemote])) 
@Remote(Array(classOf[MyEJBRemote])) 

回答

6

你已經在你的答案中的語法正確。問題是@Remote註釋使用原始類型Class而不是Class<?>。 Java原始類型是Java 1.4到Java 1.5向後兼容性約束的不幸後果,以及Scala編譯器中常見的錯誤源。

我發現bug #3429描述基本相同的問題,並將您的特定問題添加爲另一個測試用例。

唯一的解決方法是從有問題的註釋中獲取源代碼,將Class替換爲Class<?>,重新編譯它們,並將該JAR放在類路徑前面的Scalac中。除此之外,您應該投票選擇將您的電子郵件添加到CC列表的錯誤。

1

好吧,我發現,你可以使用數組作爲註解的參數所看到here。 因此,在原則上,這應該工作:

@Remote(value = Array(classOf[MyEJBRemote])) 
class MyEJB extends MyEJBRemote { 

這裏是我的MyEJBRemote:

trait MyEJBRemote { 
} 

所以數組是好的,但我的下一個問題是一個類型不匹配,從classOf [MyEJBRemote未來]。因爲看起來不可能有.class作爲註釋參數。 這也已被討論here,沒有任何解決方案。 對此將做進一步調查...

1

一如既往的合格答案......謝謝! 這是一個在JavaEE應用程序中使用Scala的真正的展示器。更改註釋對我來說不是一種選擇。 我不知道爲什麼它與Scala 2.7x一起工作。在this page作者實現這樣的註釋:

@Remote {val value = Array(classOf[ITest])} 
class TestBean extends ITest { ... 

這似乎工作。不幸的是,Scala 2.7x也不適合我...