2010-05-16 45 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也不适合我...