EJB 및 CDI와의 JAX-RS 2.0 통합

Liberty에서 JAX-RS 2.0은 EJB(Enterprise JavaBeans) 및 CDI(Contexts and Dependency Injection)와 통합됩니다.

JAX-RS 2.0이 엔터프라이즈 Bean에 대해 작동하려면 @Path를 사용하여 Bean의 클래스에 어노테이션을 작성하고 루트 자원 클래스로 변환해야 합니다.

EJB와 통합하여, EJB Bean이 REST 엔드포인트로 노출하도록 어노테이션을 작성할 수 있습니다. 또한 EJB의 보안 기능 및 JTA도 사용할 수 있습니다. Liberty에서 JAX-RS 2.0은 루트 자원 클래스, 제공자 및 애플리케이션 서브클래스로 Stateless 및 싱글톤 세션 Bean의 사용을 지원합니다. CDI와 통합하여, CDI Bean 또는 관리 Bean의 어노테이션을 REST 엔드포인트로 작성하고 웹 서비스에 대해 CDI 인젝션을 사용할 수 있습니다. Liberty에서 JAX-RS 2.0은 CDI 스타일 Bean을 루트 자원 클래스, 제공자 및 애플리케이션 서브클래스로 지원합니다. 제공자 및 애플리케이션 서브클래스는 싱글톤이거나 애플리케이션 범위를 사용해야 합니다. CDI 스펙을 사용하면 여러 유형의 Java™ EE 컴포넌트를 더 쉽게 통합할 수 있습니다. 이는 EJB 컴포넌트 또는 관리 Bean 등의 컴포넌트를 JSP 또는 다른 EJB 등의 다른 컴포넌트에 삽입하는 공통 메커니즘을 제공합니다.

EJB의 경우 Stateless 세션 Bean 및 싱글톤 POJO Bean과 함께 어노테이션을 사용할 수 있습니다.
  • Stateless 세션 Bean에 대해 다음 예제에 나타낸 것처럼 @Stateless 어노테이션을 사용하십시오.
    @Stateless
    @Path("stateless-bean")
    public class StatelessResource {...}
  • 싱글톤 Bean에 대해 다음 예제에 나타낸 것처럼 @Singleton 어노테이션을 사용하십시오.
    @Singleton
    @Path("singleton-bean")
    public class SingletonResource {...}
CDI에 대해 애플리케이션 범위 Bean과 함께 @ApplicationScoped@Inject 어노테이션을 사용할 수 있습니다.
팁: CDI 기능이 사용 안함으로 설정된 경우 JAX-RS는 오류를 보고하지 않지만 인스턴스는 POJO를 사용하여 얻어집니다.
@ApplicationScoped
@Path("/ApplicationScopedResource")
public class ApplicationScopedResource {

    private @Inject
    SimpleBean injected;

...

}

EJB 및 CDI와 통합된 JAX-RS 2.0의 제한사항

Liberty에서 JAX-RS 2.0의 제한사항에 대해서는 다음 항목을 참조하십시오.

  • JAX-RS 자원, 제공자 또는 애플리케이션으로 EJB을 사용하는 경우, EJB bean의 생성자에 @Context 인젝션을 사용할 수 없습니다. 기본 생성자가 있는 EJB는 EJB 및 JAX-RS 스펙에 따라 JAX-RS에 대해서만 사용될 수 있기 때문입니다.
  • Java 클래스에서 EJB 또는 CDI 어노테이션을 사용하지만 server.xml 파일에 EJB용(예: ejbLite-3.2) 또는 CDI용(예: cdi-1.0) Liberty 기능이 구성되지 않은 경우, 즉 Liberty에 EJB 또는 CDI 지원이 없는 경우, JAX-RS 2.0 엔진은 Java 클래스를 POJO 클래스로 사용합니다.
  • 애플리케이션 클래스의 경우 인터페이스를 구현하지 않거나 @Localbean 어노테이션이 있으면 EJB처럼 보입니다. 로컬 또는 POJO 인터페이스를 구현하는 경우에는 EJB처럼 보이지 않습니다.
    • 제공자의 경우:
      • 클래스가 @Local 어노테이션이 없는 경우에만 POJO 제공자 인터페이스를 구현하는 경우에는 올바른 EJB 제공자처럼 보입니다.
      • 클래스에 @LocalBean 어노테이션이 있고 POJO 제공자 인터페이스를 구현하는 경우에는 올바른 EJB 제공자처럼 보입니다.
      • 클래스에 @Local 어노테이션이 있는 로컬 인터페이스가 있는 경우 로컬 인터페이스는 제공자 인터페이스입니다. 이 클래스가 제공자 인터페이스를 구현하는 경우, 이는 올바른 EJB 제공자입니다.
      • 클래스에 @Local 어노테이션이 있는 로컬 인터페이스가 있고 로컬 인터페이스가 제공자 인터페이스가 아닌 경우, 이는 올바른 제공자가 아닙니다.

        이 경우 EJB 컨테이너는 POJO 제공자 인터페이스가 아니라 로컬 인터페이스에 대한 EJB 스텁만 생성할 수 있기 때문입니다.

      • 클래스에 제공자 인터페이스를 참조하는 @Local 어노테이션만 있고 이 제공자 인터페이스를 구현하지 않는 경우, 이는 JAX-RS 2.0 스펙에 따라 올바른 제공자가 아닙니다. 즉, 제공자는 이 스펙에 소개되고 자동 발견을 위해 @Provider 어노테이션이 있는 하나 이상의 JAX-RS 인터페이스를 구현하는 클래스입니다.
    • 자원의 경우:
      • EJB 기반 자원이 인터페이스를 전혀 구현하지 않는 경우, 이 클래스에서 선언된 모든 메소드를 JAX-RS 자원으로 사용할 수 있습니다.
      • EJB 기반 자원이 단일 인터페이스(로컬 또는 POJO)를 구현하는 경우, 이 인터페이스에서 선언된 모든 메소드를 JAX-RS 자원으로 사용할 수 있습니다.
      • EJB 기반 자원이 여러 인터페이스를 구현하는 경우,
        1. 모든 인터페이스가 @Local 어노테이션이 없는 POJO 인터페이스인 경우, 인터페이스에서 선언된 모든 메소드를 JAX-RS 자원으로 사용할 수 있습니다.
        2. 모든 인터페이스가 @Local 어노테이션이 있는 로컬 인터페이스인 경우, 인터페이스에서 선언된 모든 메소드를 JAX-RS 자원으로 사용할 수 있습니다.
        3. 일부 인터페이스는 @Local 어노테이션이 있는 로컬 인터페이스이고 나머지는 로컬 인터페이스가 아닌 경우, 로컬 인터페이스에서 선언된 메소드만 JAX-RS 자원으로 사용할 수 있습니다. 이 시나리오에서 EJB 컨테이너는 로컬 인터페이스를 위한 EJB 스텁만 생성할 수 있기 때문입니다.
        4. EJB 기반 자원에 @LocalBean 어노테이션이 있는 경우, 클래스에서 선언된 모든 메소드를 JAX-RS 자원으로 사용할 수 있습니다.
        5. EJB 기반 자원이 인터페이스를 구현하는 경우, JAX-RS 자원 메소드는 인터페이스에서 선언되어야 합니다. 인터페이스가 수정할 수 없는 제공자인 경우, 자원 메소드를 추가하려면 자원 클래스를 위해 새 인터페이스를 작성해야 합니다. 그렇지 않으면 EJB 자원처럼 보이지 않습니다.
  • @Path 어노테이션의 자원 클래스가 JAX-RS 제공자 인터페이스를 구현하거나 @Provider 어노테이션으로 선언하는 경우, 이 클래스는 자원 및 제공자 둘 모두로서 작동합니다. 이 경우 JAX-RS 2.0 엔진은 기본적으로 자원과 제공자가 공유하는 이 클래스의 단일 인스턴스만 사용하며, 인스턴스의 라이프사이클은 싱글톤입니다.
  • 클래스가 애플리케이션 클래스의 getClasses 및 getSingletons 메소드 둘 다에 등록된 경우, JAX-RS 2.0 엔진은 기본적으로 getSingletons 메소드의 인스턴스를 사용하고 getClasses 메소드의 등록은 무시합니다.
  • RESTful 자원이 또한 CDI 관리 Bean이며 해당 범위가 javax.enterprise.context.Dependent인 경우, CDI 제한 때문에 PreDestroy 메소드를 호출할 수 없습니다.

JAX-RS 2.0 Bean과 EJB Bean의 라이프사이클

JAX-RS Bean과 EJB Bean은 라이프사이클이 다릅니다. JAX-RS와 EJB의 Bean 라이프사이클이 충돌하는 경우, Liberty에서 라이프사이클은 EJB 컨테이너가 관리합니다. 따라서 JAX-RS 라이프사이클이 작동하지 않는 동안 EJB 인스턴스가 적용됩니다. 자세한 정보는 다음 표를 참조하십시오.
표 1. JAX-RS 2.0 Bean과 EJB Bean의 라이프사이클
애플리케이션 JAX-RS 2.0 EJB 결과
자원 perRequest Stateless Stateless
  perRequest 싱글톤 싱글톤
  싱글톤 Stateless Stateless
  싱글톤 싱글톤 싱글톤
제공자 싱글톤 Stateless Stateless
  싱글톤 싱글톤 싱글톤

JAX-RS 2.0 범위와 CDI 범위의 라이프사이클

Bean에는 해당 인스턴스의 라이프사이클을 결정하는 범위가 있습니다. JAX-RS와 CDI의 범위는 약간 다릅니다. JAX-RS와 CDI의 범위 라이프사이클이 충돌하는 경우의 결과는 다음 표를 참조하십시오.
표 2. JAX-RS 2.0 범위와 CDI 범위의 라이프사이클
애플리케이션 JAX-RS 2.0 범위 CDI 범위 어노테이션 결과
자원 perRequest @ApplicationScoped 싱글톤
  perRequest @RequestScoped perRequest
  perRequest @Dependent perRequest
  perRequest @SessionScoped Session
  perRequest   perRequest
  싱글톤 @ApplicationScoped 싱글톤
  싱글톤 @RequestScoped perRequest
  싱글톤 @Dependent 싱글톤
  싱글톤 @SessionScoped 세션
  싱글톤   싱글톤
제공자 싱글톤 @ApplicationScoped 싱글톤
  싱글톤 @RequestScoped 싱글톤
  싱글톤 @Dependent 싱글톤
  싱글톤 @SessionScoped 싱글톤
  싱글톤   싱글톤

JAX-RS 2.0 범위와 CDI 범위의 라이프사이클 충돌 메시지

JAX-RS 2.0과 CDI의 범위 라이프사이클이 충돌하는 경우, 다음 경고 메시지가 표시됩니다. 이들은 경고 메시지이며, 조치가 필요하지 않습니다.

  • CWWKW1001W: The scope {1} of JAXRS-2.0 Resource {0} does not match the CDI scope {2}. Liberty gets resource instance from {3}.
    JAXRS-2.0 자원 범위가 CDI 범위와 일치하지 않고 자원 인스턴스가 CDI에 존재하여 Liberty가 CDI으로부터 자원 인스턴스를 가져오는 경우 이 메시지가 표시됩니다. JAXRS에서 가져온 경우에는 인스턴스가 CDI 인젝션을 포함하지 않습니다.
  • CWWKW1002W: The CDI scope of JAXRS-2.0 Provider {0} is {1}. Liberty gets the provider instance from {2}.
    이 메시지는 제공자 인스턴스가 싱글톤뿐이기 때문에 표시됩니다. 제공자의 CDI 범위가 Dependent 또는 ApplicationScoped인 경우, Liberty는 CDI에서 제공자 인스턴스를 가져옵니다. JAXRS에서 가져온 경우에는 인스턴스가 CDI 인젝션을 포함하지 않습니다.

주제의 유형을 표시하는 아이콘 참조 주제



시간소인 아이콘 마지막 업데이트 날짜: Tuesday, 6 December 2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rwlp_jaxrs2.0_ejbcdi
파일 이름: rwlp_jaxrs2.0_ejbcdi.html