사용자 정의 EJB 바인딩 위치가 이전에 Liberty에서 무시되었음

20.0.0.12 이전 버전의 Liberty에서 EJB(Enterprise JavaBeans) Bean은 java:[scope] 네임스페이스에만 바인드되었습니다. EJB Bean은 서버 루트 JNDI(Java Naming and Directory Interface) 네임스페이스에 바인딩되지 않았습니다. 즉, JNDI 바인딩 이름을 정의할 수 없습니다. WebSphere Application Server traditional에서 JNDI 이름을 지정할 수 있도록 하는 EJB 바인딩 속성이 Liberty에서는 무시되었습니다.

ibm-ejb-jar-bnd.xml 파일의 다음 EJB 바인딩 속성이 Liberty에서는 무시되었습니다.

ibm-ejb-jar-bnd.xmi 파일의 다음 EJB 바인딩 속성이 Liberty에서는 무시되었습니다.

이 규칙은 20.0.0.12 이전 버전의 Liberty에서 무시되었던 모든 JNDI 바인딩 이름에 플래그를 지정합니다. 사용자의 애플리케이션이 EJB 참조를 사용하는 대신 직접 JNDI 검색에서 해당 이름을 사용하는 경우 Liberty 버전 20.0.0.12 이상을 사용하거나 애플리케이션을 수정해야 합니다.

EJB 참조를 사용하는 경우 20.0.0.12 이전 버전의 Liberty를 사용 중이면 이전 버전의 Liberty에서 Enterprise JavaBeans 검색에 대한 동작 변경 규칙이 java: 네임스페이스로 변환해야 하는 JNDI 이름을 플래그 지정합니다.

EJB 참조를 사용하지 않고 20.0.0.12 이전 버전의 Liberty를 사용 중인 경우 최신 버전의 Liberty를 사용하거나 동일한 JNDI 이름을 사용하여 EJB 참조를 작성하고 EJB 참조 binding-namejava:[scope] JNDI 이름으로 설정하는 것이 좋습니다. EJB 참조를 추가하지 않을 경우 JNDI 이름으로 사용할 Java 코드를 스캔하여 검색 이름을 java: JNDI 이름으로 변환해야 합니다.


EJB 마이그레이션 예제:

다음 예제에서는 버전 20.0.0.12 이상을 사용 중이지 않은 경우 검색 문제를 마이그레이션하는 데 도움이 되는 EJB 참조를 작성합니다.

참조된 EJB:

@Stateless
public class MyEJB implements MyEJBInterface {
public String sayHello(String name) {
"Hello-여기" 를 리턴합니다. +이름+".";
}
}

원격 인터페이스:

@Remote
public interface MyEJBInterface {
String sayHello(String name);
}

EJB 참조 예제:

다음은 Liberty에서 EJB 참조를 선언하는 방법에 대한 예제입니다. EJB와 EJB 참조를 링크하려면 2a, 2b, 3a 또는 3b와 함께 1a 또는 1b가 필요합니다. 예를 들어, 쉽고 성공적인 설치를 위해 권장되는 옵션은 1a와 2b이지만 1b가 3b와 함께 선언되면 권장 설정과 동일한 기능을 제공합니다.

  1. 참조 자체는 ejb-jar.xml 또는 web.xml에서 EJB를 참조하는 클래스 내 어노테이션을 사용하여 선언되어야 합니다.
    1. EJB 어노테이션:
      < span class="Code"> < span class= "JavaKeyword"> 공용 클래스 < /span> < span class="JavaType">TestServlet< /span> {
      @EJB(name="ejb/MyEJB")
      MyEJB myEjb;
      ....
      }

    2. ejb-jar.xml 및 web.xml:
      < span class = "Code"> < ejb-ref>
      <ejb-ref-name>ejb/MyEJB</ejb-ref-name>
      <ejb-ref-type>세션</ejb-ref-type>
      <remote>com.test.MyEJBInterface</remote>
      <ejb-ref>

  2. 참조된 EJB가 해당 참조와 동일한 애플리케이션에 있으면 ibm-ejb-jar-bnd.xml 또는 ibm-web-bnd.xml 항목이 필요하지 않습니다. 다음 단계 중 하나를 사용하면 EJB 컨테이너에서는 EJB 및 해당 참조가 동일한 애플리케이션에 있는 경우 자동으로 링크할 수 있습니다.

    1. 애플리케이션에서 하나의 Bean만 원격 EJB 인터페이스를 구현하면 추가 구성이 필요하지 않습니다.

    2. 애플리케이션에서 여러 개의 Bean이 원격 EJB 인터페이스를 구현하면 beanName 요소가 @EJB 어노테이션에 추가되어야 합니다. ejb-jar.xml 또는 web.xml을 사용하는 경우 <ejb-link> 요소가 기존 <ejb-ref> 요소에 추가되어야 합니다. 1a와 1b에 대한 수정사항은 다음과 같습니다.
      < span class="Code"> < span class= "JavaKeyword"> 공용 클래스 < /span> TestServlet {
      @EJB(name="ejb/MyEJB" beanName="MyEJB")
      MyEJB myEjb;
      ....
      }

      < span class = "Code"> < ejb-ref>
      <ejb-ref-name>ejb/MyEJB</ejb-ref-name>
      <ejb-ref-type>세션</ejb-ref-type>
      <remote>com.test.MyEJBInterface</remote>
      <ejb-link>MyEJB</ejb-link>
      <ejb-ref>

  3. 참조된 EJB가 해당 참조와 다른 애플리케이션에 있으면 검색 문자열을 추가하기 위해 다음 단계 중 하나를 완료해야 합니다. 다음 예제는 동일한 서버에서 실행 중인 애플리케이션에 대한 검색 문자열을 표시합니다.

    1. lookup 요소를 @EJB 어노테이션에 추가합니다. ejb-jar.xml 또는 web.xml을 사용하는 경우 <lookup-name> 요소가 기존 <ejb-ref> 요소에 추가되어야 합니다. 1a와 1b에 대한 수정사항은 다음과 같습니다.
      < span class="Code"> < span class= "JavaKeyword"> 공용 클래스 < /span> TestServlet {
      @EJB(name="ejb/MyEJB" lookup="java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface")
      MyEJB myEjb;
      ....
      }

      < span class = "Code"> < ejb-ref>
      <ejb-ref-name>ejb/MyEJB</ejb-ref-name>
      <ejb-ref-type>세션</ejb-ref-type>
      <remote>com.test.MyEJBInterface</remote>
      <lookup-name>java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface</lookup-name>
      <ejb-ref>

    2. ibm-ejb-jar-bnd.xml 또는 ibm-web-bnd.xml에서 참조 바인딩을 선언하십시오.
      < span class="Code"> < ejb-ref name="ejb/MyEJB"
      바인딩-name="java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface" />
      lookup, lookup-name 또는 binding-name 속성이 동일한 애플리케이션에서 EJB를 참조하는 데 선택적으로 사용될 수 있습니다. 이 경우 값이 이 페이지의 끝 부분에서 설명된 적용 가능한 직접 EJB 검색으로 설정될 수 있습니다.

다음은 최종 EJB 참조 검색입니다.

< span class="Code"> < span class= "JavaKeyword"> 공용 클래스 < /span> TestEJBClient {
public static void main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:comp/env/ejb/MyEJB");
}
}

또는 EJB 참조를 사용하지 않고 직접 EJB를 조회하는 세 가지 옵션이 있습니다.

  1. Bean이 참조와 동일한 모듈에 있는 경우:
    < span class="Code"> < span class= "JavaKeyword"> 공용 클래스 < /span> TestEJBClient {
    public static void main(String[] args) {
    ....
    MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:module/MyEJB!com.test.MyEJBInterface");
    }
    }

  2. Bean이 참조와 동일한 애플리케이션에 있는 경우:
    < span class="Code"> < span class= "JavaKeyword"> 공용 클래스 < /span> TestEJBClient {
    public static void main(String[] args) {
    ....
    MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:app/moduleA/MyEJB!com.test.MyEJBInterface");
    }
    }

  3. Bean 정의가 동일한 서버 내에서 글로벌로 발견되어야 하는 경우:
    < span class="Code"> < span class= "JavaKeyword"> 공용 클래스 < /span> TestEJBClient {
    public static void main(String[] args) {
    ....
    MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface");
    }
    }

EJB 바인딩 사용에 대한 자세한 정보는 Libery에서 EJB에 원격 인터페이스 사용 EJB 3.0 및 EJB 3.1 애플리케이션 바인딩 개요를 참조하십시오.