EJB의 로컬 인터페이스를 어떻게 선택할 수 있습니까?
문제
다음 ejb (EJB3 사용)가 있다고 말합니다.
@Stateless(name="Queries")
@Remote(Queries.class)
@Local(Queries.class)
public final class QueriesEJB implements Queries {
...
}
이 클래스는 로컬 인터페이스와 원격 인터페이스를 통해 제공됩니다.
앱의 다른 부분 에서이 EJB의 로컬 인터페이스를 어떻게 주입 할 수 있습니까?
구체적으로, 나는 현지의 상호 작용. 예를 들어, 다음과 같이 충분합니까?
@EJB(name="Queries") private Queries queries;
특히 @ejb의 'Beaninterface'속성을 구별하기 위해 단순히 별도의 로컬 및 원격 인터페이스를 만들지 않기로합니다.
해결책
사양에 따르면 원격 및 로컬 인 인터페이스를 동시에 가질 수 없습니다. 그러나 슈퍼 인터페이스를 만들고 모든 메소드를 거기에 넣은 다음 2 개의 하위 인터페이스를 만듭니다. 그렇게 한 후 @ejb를 사용하십시오. 이렇게하면 하나의 인터페이스 만 유지해야합니다.
편집 : "EJB3 Spec Simplifified"의 섹션 3.2를 참조하십시오. http://jcp.org/aboutjava/communityprocess/final/jsr220/index.html
다른 팁
EJB가 배치되면 컨테이너는 인터페이스를보고 로컬 및 원격 인터페이스를 식별합니다. EJB 컨테이너는 이미 예제에서 로컬 인터페이스를 사용한다고 말합니다. 컨테이너가 로컬 인터페이스를 사용할 수 있기 때문에이 경우 원격 인터페이스를 사용하는 것은 단순히 원격 인터페이스를 사용하지 않습니다.
로컬 인터페이스의 jndi 이름을 @ejb 주석의 매개 변수로 사용하려고합니다.
@EJB(name="java:comp/env/ejb/EntitySupplierLocal")
위의 예에서는 인터페이스 이름에 로컬을 추가했습니다. 귀하의 경우에는 올바른 이름을 얻으려면 JNDI 컨텍스트를 살펴 봐야합니다.
일반적으로 비즈니스 방법을 정의하고 로컬 및 원격 인터페이스를 확장하는 기본 인터페이스를 사용하는 것이 좋습니다. 따라서 메소드를 복제 할 필요가 없으며 로컬 및 원격 액세스에 대한 기능을 확장 할 수 있습니다.
public interface Queries () { .. }
@Local
public interface QueriesLocal extends Queries () { .. }
@Remote
public interface QueriesRemote extends Queries () { .. }
이전 의견의 솔루션은 JBoss의 EJB 3.0과 완전히 호환되지 않습니다.
이 오류를 쉽게 얻을 수 있습니다.
org.jboss.ejb3.common.resolvers.spi.NonDeterministicInterfaceException:
beanInterface specified, Queries, is not unique within EJB QueriesEJB
이것 만 만들기 :
public interface Queries () //Local by default
@Remote
public interface QueriesRemote extends Queries () { ... }
효과가있다