2014-04-11 2 views
0

나는 얼마 전에 Jboss 4.2.3 (JavaEE 5) 컨텍스트 내에서이 질문을 던졌으며 구성을 위해 Spring을 시도하는 대답을 얻었지만 필요하지 않을 때 다른 프레임 워크를 추가하지는 않을 것입니다.JBoss에서 EJB 특수화

이제 JavaEE 6 및 7을 사용하면 내 문제에 대한 간단한 해결책이 있다는 느낌이 들게됩니다. 그러나 나는 운 좋게도 아직 검색을하지 못해서 올바른 길로 나를 인도 할 수 있다면, 정말로 당신의 도움에 감사 할 것입니다. 우리는 EJB 인터페이스 IEjb 그 인터페이스의 implentation EjbA을 제공하는 라이브러리가

가정합니다

다음은 문제입니다. EJB를 추가로 제공하는 다른 라이브러리가 몇 개 있으며 그 중 두 개는 @EJB IEjb ref을 포함합니다. 즉, IEjb 인터페이스를 노출하는 EJB에 대한 참조가 필요합니다.

지금 완전히 즉 EjbA해야 결코 전체 응용 프로그램에서 사용하는, 대체 구현 EjbB으로 EjbA 교체 할 필요가있다.

  • "EjbA를 포함하는 라이브러리를 배포하지 않습니다": 이것은 불가능합니다 EJB를 다른 있기 때문에

    우리가 사용할 수 없거나 오히려 큰 변화를 필요로하는 몇 가지 옵션이 있습니다 필요한 경우 오히려 큰 우리 도서관의 변화와

  • "비 EJB와 같은 EjbA 구현을 사용하는 응용 프로그램, 서브 클래스를 필요로하고, 서브 클래스합니다
  • "lib 디렉토리에서 EjbA을 추출 할 "필요로하는 EJB ": 위와 같은 이유가 적용됩니다. 큰 변화가 필요합니다.
  • "삭제 EjbA": 사용해야하는 다른 응용 프로그램이 있습니다. 현재 대체 응용 프로그램을 사용해야하는 응용 프로그램이 있습니다.

그래서 내가 생각할 수있는 몇 가지 방법이 있습니다 : IEjb의 유일한 구현 EjbB 될 것이며, 의존성 주입이 잘 될 것이다 그래야

  • EjbA를 배포하지 않는 서버를 알려
  • 종속성 주입에 IEjb의 인스턴스가 필요할 때 항상 EjbB을 사용하도록 지시하십시오 (CDI의 @Specializes과 유사하지만 EJB의 경우 - JavaEE 7에서 가능)?

이것에 대한 아이디어가 있습니까? 이것이 가능합니까 (나는 그 느낌이 예스입니다), 그렇다면 어떻게?


환경에 대한 참고 사항 : 현재 JBoss 7.2.0에서 실행 중이지만 Wildfly를 사용할 때만 가능하다면이 옵션이 될 수 있습니다 (업데이트는 필요하지 않지만 이미).

답변

1

아이디어의 몇 : 어쨌든

  • 사용 (어쨌든 권장) 지역 EJB를 주입하기 위해 EJB 주석에게
  • 사용 @Inject를 제거하지해야하는 경우

    • 이 EjbA을 삭제합니다. CDI에서는 AFAIK라는 기본 구현을 지정할 수 있다고 생각합니다.
  • +0

    , 다른 사람

    Baseimplementation은 다음과 같습니다 그것을 사용할 필요가있다. 주석을 제거하는 것은 위에서 설명한 것처럼 옵션이 아닙니다. 그러나, 나는'@ Inject'를 사용하는 것을 좋아하고 적어도 더 새로운 WELD 버전으로'@ Specializes'를 사용할 수있게하려고 노력할 것입니다. – Thomas

    +1

    +1 @EJB를 삽입하기 위해 @EJB 대신 @Inject를 사용합니다. 이 접근 방식을 사용하면 2 개의 세계 EJB + CDI 중 최상의 것을 얻을 수 있습니다. 그렇게하면 CDI'@ Alternative' 또는'@ Specializes'를 사용하는 데 아무런 문제가 없습니다. –

    +0

    @Inject가 트릭을합니다. 감사합니다. – Thomas

    1

    littlebit 늦었지 만 EJB는 CDI Beans가 아닌 트랜잭션을 지원합니다. 그러나 EJB의 모든 메소드를 프록시하는 해당 CDI 빈에 EJB 삽입을 래핑 할 수 있습니다. Enother EJB를 얻으려면 @ Specializes-CDI를 작성합니다. 보기 (다만, 나가 의미하는 무엇을 보여주기 위하여).

    @Stateless // or whatever 
    class BaseEjb { 
        public void doSomeMagic() {...} 
    } 
    
    @Named 
    class BaseCdi { 
        @EJB 
        private BaseEjb ejb; 
        public void doSomeMagic() { ejb.doSomeMagic(); } 
    } 
    

    커스터마이즈는 다음과 같이 작동합니다 : 그것은 단지 하나의 응용 프로그램에서 교체해야하기 때문에 EjbA`이 옵션을 선택하지 않습니다`삭제

    @Stateless // or whatever 
    class SpecializedEjb extends BaseEjb {...} 
    
    @Specializes 
    class SpecializedCdi extends BaseCdi { 
        @EJB 
        private SpecializedEjb ejb; 
        public void doSomeMagic() { ejb.doSomeMagic(); } 
    } 
    
    +0

    안녕하세요, CDI를 통해 우리는 그런 것을 할 수있었습니다. 기본적으로 EJB는 빈 (bean)이므로 빈 상자에서 특수화를 지원합니다. 우리는'@ EJB' (거의 사용하지 않는 몇 가지 기능을 제공함) 대신'@ Inject' (어쨌든 주입에 선호되는 방법)를 사용하기 만하면됩니다. 우리는 커스텀 인터셉터를 사용했고 Weld 버전의 EJB 해상도를 방해했기 때문에 JBoss 7.2에 문제가있었습니다. Wildfly (최소 10.0)에서는 완벽하게 작동합니다. – Thomas

    +0

    의견에 감사드립니다. – Sven