2013-01-21 2 views
1

저는 JBoss 7.1.1을 CDI와 함께 사용하고 있습니다.JEE6 : 대체 EJB 선언

JNDI에 ServiceAccount라는 Stateless bean이 있습니다. 이것이 실제 서비스 구현입니다. 모의 서비스 인 ServiceAccountMock이라는 또 다른 Statelss bean이 있습니다. 동일한 인터페이스에서 herited되어 service.ear 패키지로 제공됩니다.

내가하려는 일은 bean.xml에서 모의 ​​서비스를 대안으로 선언하고 내 서비스 귀를 다시 배포 한 다음 모든 클라이언트가 모의 버전 (클라이언트 측에서 아무 것도 변경하지 않고)을 보는 것입니다.

내 service.ear를 배포

은 JBoss는 말한다 : 이것은 사실이다

java.lang.IllegalArgumentException: JBAS011046: A component named 'ServiceAccount' is already defined in this module 

, 두 서비스 모두 같은 방식 (@Stateless (이름 = "ServiceAccount을")) 선언됩니다.

가짜 버전의 이름을 변경하면 EJB가 사용되는 클라이언트 측에서 변경해야합니다. (그렇게하고 싶지 않습니다.)

누구든지 어떻게하는지 압니까?

+0

대체 스테이트리스 EJB에 대해 @Stateless 주석에 다른 이름을 지정하면 전개 오류가 사라지나요? –

+0

@Reynols : 예. – jmcollin92

답변

8

난 당신이에 같은 이름을 가진 두 콩을 배포 할 수 있습니다 생각하지 않는다 :

@Stateless(name="ServiceAccount") 
@Alternative 
public class ServiceAccountMock{ 
.... 
} 

그런 다음 beans.xml에 당신은 모의 구현을 선택하기 위해 A/S 말할 필요 같은 응용 프로그램.

빈의 클라이언트가 로컬에만있는 경우 CDI 유형 삽입 선택을 사용해야합니다.

  • 진짜 이름이 필요한 경우 bean 이름을 제거하거나 다른 이름을 넣으십시오 (모의은 실제 구현과 다른 이름이됩니다).
  • 모의목에 @Alternative 주석을 보관합니다.
  • 주입 지점에서 변수 유형으로 인터페이스를 사용하십시오 (아마도 @EJB 대신 @Inject 주석을 사용하는 것이 좋습니다).

EJB 사양과 CDI가 아직 완전히 일치하지 않습니다. EJB에는 응용 프로그램에서 고유해야 할 필요가있는 이름과 같은 일부 요소가 있으며 CDI 대체 기능에서 고려되지 않습니다.

그래서 나는 EJB 이름 삽입 선택과 CDI 대체 주입 선택을 혼합 할 수있을 것이라고 생각하지 않습니다.

+1

그것은 또한 나의 결론입니다. 내가 구현 한 해결 방법은 CDI로 다른 구현을 삽입 한 고유 한 EJB facade를 갖는 것이 었습니다. 클라이언트 EJB가 항상 같고 호출을 다른 mock bean으로 투명하게 라우트 할 수 있기 때문입니다. – jmcollin92

0

처음에 ServiceAccountMock@Alternative으로 주석을 달아 지시되지 않은 경우 사용하지 말도록 컨테이너에 알려야합니다.

... 
<alternatives> 
    <class>xx.yy.ServiceAccountMock</class> 
</alternatives> 
... 
+0

그건 이미 끝났어. 그러나 오류는 여전히 존재합니다. – jmcollin92

+0

@ jmcollin92이 경우, 약간의 코드가 도움이 될 것이라고 생각합니다. 특히 'ServiceAccount'와'ServiceAccountMock'의 클래스 서명은 –

+1

Thx입니다. 위의 Kazaag처럼, 나는 그것이 실제로 가능하지 않다고 생각합니다. CDI는 JNDI를 다루지 않습니다. @Alternative는 JNDI를 수정하지 않습니다. 관심을 가질만한 사람들을위한 해결책을 게시했습니다. – jmcollin92