2010-05-16 5 views
9

스칼라 2.8을 사용하여 JavaEE 세션 빈을 구현하려고합니다. 그것은 원격 세션 콩이기 때문에
, 나는 다음과 같은 자바 주석과 주석을 가지고스칼라 2.8 : 배열 매개 변수로 Java 어노테이션 사용

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

가 난 단지 스칼라 2.7 this example을 발견했다.

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

어떻게 내가이 주석 스칼라 2.8과 같은 방법을 사용할 수 있습니다 스칼라 2.7에서, 그 수는 다음과 같이 세션 빈을 정의? 나는 이미 많은 다른 버전을 시도했다. "주석 인수는 상수 일 필요가있다.", "불법적 인 간단한 표현"이 필요하다. 이러한 정의의 모든 작동하지 않습니다

@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 컴파일러의 일반적인 버그 소스로 인한 불행한 결과입니다.

기본적으로 동일한 문제를 설명하는 #3429 버그를 발견했으며 다른 특정 테스트 케이스로 특정 문제를 추가했습니다.

유일한 문제 해결 방법은 문제가되는 주석에서 소스 코드를 가져와 을 Class<?>으로 바꾼 다음 다시 컴파일하고 해당 JAR을 Scalac의 클래스 경로 앞에 배치하는 것입니다. 그 외, CC 목록에 전자 메일을 추가하는 버그에 투표해야합니다.

1

좋아, 내가 here을 볼 때 당신이 주석 매개 변수로 배열을 사용할 수 있음을 발견했다. 그래서 원칙적으로 이 해야 일 : 여기

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

내 MyEJBRemote입니다 :

trait MyEJBRemote { 
} 

그래서 배열은 괜찮지 만, 내 다음 문제는 classOf [MyEJBRemote에서 오는 유형 불일치입니다 ]. annotation 매개 변수로 .class를 사용할 수없는 것 같습니다. 이것에 대해서도 아무런 해결책도없이 here에 대해 논의했습니다. 이 문제에 대한 추가 조사는 ...

1

항상 유능한 대답 ... 감사합니다. 이것은 JavaEE 애플리케이션에서 Scala를 사용하는 진정한 쇼이다. 특수 효과를 변경하는 것은 나를위한 옵션이 아닙니다. Scala 2.7x에서 왜 작동하는지 궁금합니다.

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

작동하는 것 같다 : this page에서 저자는 다음과 같이 주석을 구현합니다. 불행히도 Scala 2.7x는 나를위한 옵션이 아닙니다.

관련 문제