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 등의 다른 컴포넌트에 삽입하는 공통 메커니즘을 제공합니다.
- Stateless 세션 Bean에 대해 다음 예제에 나타낸 것처럼 @Stateless 어노테이션을 사용하십시오.
@Stateless @Path("stateless-bean") public class StatelessResource {...}
- 싱글톤 Bean에 대해 다음 예제에 나타낸 것처럼 @Singleton 어노테이션을 사용하십시오.
@Singleton @Path("singleton-bean") public class SingletonResource {...}
@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 기반 자원이 여러 인터페이스를 구현하는 경우,
- 모든 인터페이스가 @Local 어노테이션이 없는 POJO 인터페이스인 경우, 인터페이스에서 선언된 모든 메소드를 JAX-RS 자원으로 사용할 수 있습니다.
- 모든 인터페이스가 @Local 어노테이션이 있는 로컬 인터페이스인 경우, 인터페이스에서 선언된 모든 메소드를 JAX-RS 자원으로 사용할 수 있습니다.
- 일부 인터페이스는 @Local 어노테이션이 있는 로컬 인터페이스이고 나머지는 로컬 인터페이스가 아닌 경우, 로컬 인터페이스에서 선언된 메소드만 JAX-RS 자원으로 사용할 수 있습니다. 이 시나리오에서 EJB 컨테이너는 로컬 인터페이스를 위한 EJB 스텁만 생성할 수 있기 때문입니다.
- EJB 기반 자원에 @LocalBean 어노테이션이 있는 경우, 클래스에서 선언된 모든 메소드를 JAX-RS 자원으로 사용할 수 있습니다.
- 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 2.0 | EJB | 결과 |
---|---|---|---|
자원 | perRequest | Stateless | Stateless |
perRequest | 싱글톤 | 싱글톤 | |
싱글톤 | Stateless | Stateless | |
싱글톤 | 싱글톤 | 싱글톤 | |
제공자 | 싱글톤 | Stateless | Stateless |
싱글톤 | 싱글톤 | 싱글톤 |
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의 범위 라이프사이클이 충돌하는 경우, 다음 경고 메시지가 표시됩니다. 이들은 경고 메시지이며, 조치가 필요하지 않습니다.
JAXRS-2.0 자원 범위가 CDI 범위와 일치하지 않고 자원 인스턴스가 CDI에 존재하여 Liberty가 CDI으로부터 자원 인스턴스를 가져오는 경우 이 메시지가 표시됩니다. JAXRS에서 가져온 경우에는 인스턴스가 CDI 인젝션을 포함하지 않습니다.CWWKW1001W: The scope {1} of JAXRS-2.0 Resource {0} does not match the CDI scope {2}. Liberty gets resource instance from {3}.
이 메시지는 제공자 인스턴스가 싱글톤뿐이기 때문에 표시됩니다. 제공자의 CDI 범위가 Dependent 또는 ApplicationScoped인 경우, Liberty는 CDI에서 제공자 인스턴스를 가져옵니다. JAXRS에서 가져온 경우에는 인스턴스가 CDI 인젝션을 포함하지 않습니다.CWWKW1002W: The CDI scope of JAXRS-2.0 Provider {0} is {1}. Liberty gets the provider instance from {2}.