2010-05-16 5 views
9

J'essaye d'implémenter un JavaEE Session Bean avec Scala 2.8.
Parce qu'il est une session à distance Bean, je dois annoter avec Java annotation suivante:Scala 2.8: utiliser l'annotation Java avec un paramètre de tableau

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

Je ne trouve this example pour scala 2.7. Dans Scala 2.7, il est possible de définir la bean session comme ceci:

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

Comment puis-je utiliser cette annotation de la même manière avec Scala 2.8? J'ai déjà essayé plusieurs versions différentes, toutes ayant pour résultat "l'argument d'annotation doit être une constante", "début illégal de l'expression simple". Toutes ces définitions ne fonctionnent pas:

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

Répondre

6

Vous avez la syntaxe dans votre réponse. Le problème est que l'annotation @Remote utilise le type brut Class plutôt que Class<?>. Les types bruts Java sont une conséquence malheureuse des contraintes de compatibilité ascendante de Java 1.4 vers Java 1.5, et la source commune de bogues dans le compilateur Scala.

J'ai trouvé le bogue #3429 décrivant fondamentalement le même problème, et ajouté votre problème particulier dans un autre cas de test. La seule solution consiste à supprimer le code source de l'annotation problématique, à remplacer Class par Class<?>, à les recompiler et à placer ce fichier JAR devant le chemin de classe vers Scalac. A part ça, vous devriez voter pour le bug en ajoutant votre email à la liste CC.

1

D'accord, j'ai découvert que vous pouvez utiliser un tableau comme un paramètre d'annotation comme on le voit here. Donc, en principe, ce devrait travail:

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

Voici mon MyEJBRemote:

trait MyEJBRemote { 
} 

Ainsi, le tableau est correct, mais mon prochain problème est une incompatibilité de type provenant classof [MyEJBRemote ]. Comme il semble qu'il n'est pas possible d'avoir un .class comme paramètre d'annotation. Cela a également été discuté here, sans aucune solution à cela. Fera une enquête plus approfondie sur ce ...

1

Comme toujours une réponse compétente ... merci! Ceci est un véritable show-stopper pour utiliser Scala dans une application JavaEE. Changer l'annotation n'est pas une option pour moi. Je me demande pourquoi cela a fonctionné avec Scala 2.7x. Sur this page l'auteur met en œuvre l'annotation comme ceci:

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

Ce qui semble fonctionner. Malheureusement, Scala 2.7x n'est pas non plus une option pour moi ...

Questions connexes