Scala 2.8: используйте аннотацию Java с параметром массива - PullRequest
9 голосов
/ 16 мая 2010

Я пытаюсь реализовать сессионный компонент JavaEE с помощью Scala 2.8.
Поскольку это Remote Session Bean, я должен аннотировать его следующей аннотацией Java:

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

Я нашел только этот пример для scala 2.7. В Scala 2.7 возможно определить сессионный компонент следующим образом:

@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]))

Ответы [ 3 ]

6 голосов
/ 16 мая 2010

У вас есть синтаксис прямо в вашем ответе. Проблема в том, что в аннотации @Remote используется необработанный тип Class, а не Class<?>. Необработанные типы Java являются печальным следствием ограничений обратной совместимости от Java 1.4 до Java 1.5 и общего источника ошибок в компиляторе Scala.

Я нашел ошибку # 3429 , описывающую в основном ту же проблему, и добавил вашу конкретную проблему в качестве другого контрольного примера.

Единственный обходной путь - взять исходный код из проблемной аннотации, заменить Class на Class<?>, перекомпилировать их и поместить этот JAR перед путь к классу в Scalac. Кроме этого, вы должны проголосовать за ошибку, добавив вашу электронную почту в список CC.

1 голос
/ 17 мая 2010

Как всегда грамотный ответ ... спасибо! Это настоящий ограничитель использования Scala в приложении JavaEE. Изменение аннотации не вариант для меня. Интересно, почему это работает со Scala 2.7x? На этой странице автор реализует аннотацию так:

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

Что, кажется, работает. К сожалению, Scala 2.7x также не подходит для меня ...

1 голос
/ 16 мая 2010

Хорошо, я обнаружил, что вы МОЖЕТЕ использовать массив в качестве параметра аннотации, как показано здесь . Так что в принципе, это должно работать:

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

Вот мой MyEJBRemote:

trait MyEJBRemote {
}

Так что с массивом все в порядке, но моя следующая проблема - это несоответствие типов из classOf [MyEJBRemote] . Как кажется, невозможно иметь .class в качестве параметра аннотации. Это также обсуждалось здесь , без какого-либо решения этого. Будет ли дальнейшее расследование по этому ...

...