2010-05-16 11 views
9

Estoy tratando de implementar un bean de sesión con JavaEE Scala 2.8.
Porque es un bean de sesión remoto, tengo que anotar que con la siguiente anotación de Java:Scala 2.8: utilizar la anotación de Java con un parámetro de matriz

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

Sólo he encontrado this example de Scala 2.7. En Scala 2.7, su posible definir el bean de sesión como esto:

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

¿Cómo puedo utilizar esta anotación de la misma manera con Scala 2.8? Ya probé muchas versiones diferentes, resultando todo en "el argumento de anotación debe ser una constante", "inicio ilegal de expresión simple". Todas estas definiciones no funcionan:

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

Respuesta

6

usted tiene la sintaxis correcta en su respuesta. El problema es que la anotación @ Remote utiliza la materia prima de tipo Class en lugar de Class<?>. Los tipos RAW de Java son una consecuencia desafortunada de las restricciones de compatibilidad con versiones anteriores de Java 1.4 a Java 1.5 y fuente común de errores en el compilador de Scala.

me encontré fallo #3429 que describe básicamente el mismo problema, y ​​ha añadido que su problema particular como otro caso de prueba.

La única solución sería tomar el código fuente de la anotación problemática, reemplace Class con Class<?>, recompilarlas, y poner ese JAR frente a la ruta de clase a scalac. Aparte de eso, debe votar por el error al agregar su correo electrónico a la lista CC.

1

De acuerdo, entonces descubrí que se puede utilizar una matriz como un parámetro de anotación como se ve here. Por lo tanto, en principio, esta debe trabajo:

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

Aquí está mi MyEJBRemote:

trait MyEJBRemote { 
} 

Así que la matriz está bien, pero mi siguiente problema es una falta de coincidencia de tipo procedentes de classof [MyEJBRemote ]. Como parece, no es posible tener una .class como parámetro de anotación. Esto también se ha discutido here, sin ninguna solución a esto. va a hacer más investigación en este ...

1

Como siempre una respuesta competente ... Gracias! Este es un verdadero stop-show para usar Scala en una aplicación JavaEE. Cambiar la anotación no es una opción para mí. Me pregunto por qué funcionó con Scala 2.7x. En this page el autor implementa la anotación de esta manera:

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

que parece funcionar. Por desgracia, también Scala 2.7x no es una opción para mí ...

Cuestiones relacionadas