Я пытаюсь реализовать Боб Сессии JavaEE с Scala 2.8.
Поскольку это - Боб Удаленного сеанса, я должен аннотировать его следующей Аннотацией 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]))
Вы правильно поняли синтаксис в своем ответе. Проблема в том, что аннотация @Remote использует необработанный тип Class
, а не Class >
. Необработанные типы Java - неудачное следствие ограничений обратной совместимости от Java 1.4 до Java 1.5 и общий источник ошибок в компиляторе Scala.
Я обнаружил ошибку # 3429 , описывающую в основном ту же проблему, и добавил вашу конкретную проблему в качестве другого тестового примера.
Единственный обходной путь - взять исходный код из проблемной аннотации, заменить Class
на Class >
, перекомпилировать их и поместить этот JAR перед путем к классам. в Скалак. Помимо этого, вы должны проголосовать за ошибку, добавив ваш адрес электронной почты в список CC.
Как всегда компетентный ответ... Спасибо! Это настоящий шоу-стоппер для использования Scala в javaEE-приложении. Изменение аннотации не вариант для меня. Интересно, почему это сработало с Scala 2.7x. На этой странице автор реализует аннотацию следующим образом:
@Remote {val value = Array(classOf[ITest])}
class TestBean extends ITest { ...
Которая, похоже, работает. К сожалению, Scala 2.7x также не вариант для меня...
Хорошо, я обнаружил, что вы МОЖЕТЕ использовать массив в качестве параметра аннотации, как показано здесь . В принципе, этот должен работать:
@Remote(value = Array(classOf[MyEJBRemote]))
class MyEJB extends MyEJBRemote {
Вот мой MyEJBRemote:
trait MyEJBRemote {
}
Итак, с массивом все в порядке, но моя следующая проблема - несоответствие типов, исходящее из classOf [MyEJBRemote] . Кажется, что невозможно использовать .class в качестве параметра аннотации. Это также обсуждалось здесь , но без какого-либо решения этого вопроса. Проведем дальнейшее расследование по этому поводу ...