CDI(Contexts and Dependency Injection) 문제점 해결
Java™ EE(Java Platform, Enterprise Edition) 애플리케이션에 대한 CDI(Contexts and Dependency Injection)와 관련된 오류를 문제점 해결하십시오.
시작하기 전에
이 태스크 정보
CDI 구현을 사용하는 경우 CDI가 다른 Java EE 컴포넌트와 상호 작용하는 경우 또는 애플리케이션 배치 중 오류가 발생할 수 있습니다. 생성자, 인터셉터 및 데코레이터나 진단 추적에 대한 문제점을 겪을 수도 있습니다. 이 태스크를 사용하여 발생 가능한 이러한 오류를 해결할 수 있습니다.
프로시저
- 애플리케이션 배치 문제점을 해결하십시오. 애플리케이션 배치 시점에서 컨테이너는 애플리케이션에서 각 인젝션 지점을
유효성 검증해야 하며, 해당 종속성의 소스로만 이를 만족할 수 있습니다.
문제점 방지: 핫 배치는 CDI 애플리케이션에서 지원되지 않습니다. 업데이트를 사용 가능하게 만들려면 애플리케이션을 다시 시작해야 합니다. gotcha
- 모호한 종속성을 해결하십시오.
모호한 종속성 또는 javax.enterprise.inject.AmbiguousResolutionException 예외는 컨테이너가 둘 이상의 관리 대상 Bean, 생성자 메소드 또는 생성자 필드에 대한 인젝션 지점 유형 및 규정자를 분석할 때 발생합니다.
이 예외는 처리 중인 인젝션 지점과 유형 보안 분석 프로세스 종료 시 남아 있는 후보 Bean을 알려줍니다. 단일 Bean 이외의 모든 항목은 애플리케이션 오류입니다.
오류를 해결하려면 다음 조치 중 하나를 완료하십시오.org.jboss.weld.exceptions.DeploymentException: WELD-001409: Ambiguous dependencies for type OtherBean with qualifiers @Default at injection point [BackedAnnotatedField] @Inject private basic.injection.SimpleBean.bean at basic.injection.SimpleBean.bean(SimpleBean.java:0) Possible dependencies: - Managed Bean [class basic.injection.OtherBean] with qualifiers [@Any @Default], - Producer Method [OtherBean] with qualifiers [@Any @Default] declared as [[BackedAnnotatedMethod] @Produces basic.injection.OtherBeanProducer.produceOtherBean()]
- 인젝션 지점 및 필요한 경우 종속성의 소스 하나에 규정자를 추가하여 인젝션 지점의 모호성을 제거하십시오.
- 인젝션에서 종속성 중 일부를 고려해서는 안 되는 경우 필요하면 @Alternative 또는 @Specializes를 통해 컨텍스트 인스턴스의 소스 중 하나를 어노테이션으로 작성하십시오.
- 만족할 수 없는 종속성을 해결하십시오. 애플리케이션에서 인젝션 지점과 일치하는 오브젝트에 대응하는 소스가 없으면 만족시킬 수 없는 종속성 또는 javax.enterprise.inject.UnsatisfiedResolutionException이 발생합니다. 규정자 어노테이션의 선택적 세트와 함께 필드의 API 유형은 종속성을 만족시키기 위해 유효한 Bean 세트를 기술합니다. 종속성을 만족시킬 수 없는 원인은 다음과 같습니다.
- 인젝션 지점에서 유형에 지정 가능한 관리 대상 Bean이 없습니다.
- 인젝션 지점에 리턴 유형을 지정할 수 있는 관리 대상 Bean의 생성자 메소드가 없습니다.
- 인젝션 지점에 유형을 지정할 수 있는 관리 대상 Bean의 생성자 필드가 없습니다.
- 이전에 언급된 시나리오 중 하나는 유효하지만, 인젝션 지점의 규정자 어노테이션은 Bean 또는 생성자에 없습니다.
참고: 새 Bean을 도입하거나 규정자를 제거하거나 생성자 필드나 메소드를 추가하여 API 유형 및 규정자를 포함하는 종속성을 사용 가능 항목으로 표시하여 오류를 해결하십시오. Java 스펙의 CDI(Contexts and Dependency Injection) 5.2 절에서는 type-safe 분석을 자세히 설명합니다.org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type OtherBean with qualifiers @British at injection point [BackedAnnotatedField] @Inject @British private basic.injection.SimpleBean.bean at basic.injection.SimpleBean.bean(SimpleBean.java:0) WELD-001475: The following beans match by type, but none have matching qualifiers: - Managed Bean [class basic.injection.OtherBean] with qualifiers [@Any @Default], - Producer Method [OtherBean] with qualifiers [@Any @Default] declared as [[BackedAnnotatedMethod] @Produces basic.injection.OtherBeanProducer.produceOtherBean()]
- 수동화된 범위 종속성을 해결하십시오. 수동화(Passivation)란, 메모리 보조 스토리지에 보관되는 유효 오브젝트를 이동하는 동작입니다. 기본 제공 범위, @SessionScoped 및 @ConversationScoped 같은 수동화 범위는 해당 범위를 사용하는 모든 Bean이 수동화 가능할 것을 요구합니다. Bean은 Stateful 세션 Bean 또는 둘 다 직렬화 가능한 기타 관리 대상 Bean인 경우 수동화 가능하고, 직렬화 불가능한 인터셉터 및 데코레이터를 포함하지 않습니다. 수동화된 범위 종속성 원인으로는 다음이 포함됩니다.
- 기존 Bean의 범위를 수동화 범위(예: @SessionScoped 또는 @ConversationScoped)로 변경.
- 직렬화 불가능한 데코레이터 또는 인터셉터를 기존 수동화 가능 Bean에 추가합니다.
- 문제가 되는 Bean이 직렬화 가능한지 확인하십시오.
- Bean의 모든 인터셉터 및 데코레이터가 직렬화 가능하도록 구현되는지 확인하십시오.
- 관리 대상 Bean의 범위를 수동화 외 범위로 변경하십시오.
- 모호한 종속성을 해결하십시오.
- CDI가 기타 Java EE
컴포넌트와 상호 작용하게 하는 오류를 해결하십시오.
@Inject 어노테이션은 Java EE 종속성 인젝션의 추가 유형을 제공합니다. Java EE 5에 정의된 인젝션에 대한 관계는 다음과 같습니다.
- @Inject annotation 외 다른 어노테이션을 사용하는 인젝션은 이전 릴리스와 동일하게 작동하고 @Inject 어노테이션을 사용하여 삽입된 종속성만 Java CDI(Contexts and Dependency Injection)(JSR299)에서 정의한 대로 컨텍스트 인스턴스입니다.
- 생성자 필드 및 생성자 메소드를 사용하여 @Resource, @PersistenceContext, @PersistenceUnit 및 @WebServiceRef 어노테이션을 사용하여 얻은 Java EE 종속성의 제한된 CDI 기능(예: type-safe 인젝션)을 제공하십시오.
JSP(JavaServer Pages) 및 JSF(JavaServer Faces) 컴포넌트의 관리 대상 Bean에 대한 EL(Expression Language) 참조의 값을 확보할 수 없는 경우 다음 접근 방식을 고려하십시오.- Bean 클래스가 @Named 어노테이션을 사용하여 어노테이션이 있는지 또는 @Named 어노테이션을 정의하는 스테레오타입으로 어노테이션되는지 확인하십시오.
- 첫 번째 문자를 소문자로 변환한 후에 EL 표현식이 Bean 클래스의 클래스 이름과 일치하는지 확인하십시오. 값 구성원을 포함하는 @Named 어노테이션 규정자(예: @Named("myName"))를 사용할 때, 이것은 Bean 이름(특별한 문자 규정자)을 지정하지만 해당 Bean의 EL 이름을 변경하지 않습니다.
EJB 컴포넌트의 경우:- @Inject 및 @EJB 어노테이션으로 세션 Bean을 삽입할 수 있습니다. @Inject 어노테이션을 통해 Stateful 세션 Bean을 삽입하는 경우 세션 Bean은 규정자를 사용하여 type-safe 인젝션을 활용하고 해당 CDI 범위에서 해당 라이프사이클을 관리할 수 있습니다.
- 세션 Bean은 다른 관리 대상 Bean과 달리, @Inject 어노테이션을 통해 확보하지 않은 경우 인터셉션 및 데코레이션에 적격합니다.
웹 서비스 컴포넌트의 경우:- WSDL(Web Services Description Language) 파일에서 JAX-WS 클라이언트를
개발하려면 WSDL 파일에서 JAX-WS 클라이언트 개발 주제에서 간략히 설명하는
단계를 따르십시오. 팁: wsimport 도구를 사용하여 서비스 클래스를 포함한 이식 가능한 Java 아티팩트를 생성하십시오.
- @WebServiceRef 어노테이션을 사용하여 생성된 서비스 클래스를 CDI 관리 Bean으로 삽입하려는 경우, -wsdllocation 인수를 사용하여 wsimport 도구를 호출해야 합니다. 결과적으로 생성된 서비스 클래스는 다른 시스템으로 이식 가능합니다. 서비스 클래스가 절대 경로 대신, 상대적 URI를 사용하여 WSDL 파일을 참조하기 때문입니다.
- 생성자 오류를 해결하십시오.
- 생성자 메소드를 루핑하십시오. 생성자 메소드를 사용하는 경우 각 매개변수는 컨테이너가 종속성을 제공하는 인젝션 지점으로 처리됩니다. 따라서 이 매개변수 인젝션 지점을 이행하는 컨텍스트 오브젝트의 소스는 생성자 메소드를 포함하는 동일한 클래스일 수 없습니다.
- 생성자 메소드(동일한 클래스에 있는 동일한 규정자를 갖는 두 개의 @Produces 어노테이션)를 복제하십시오. 클래스에 여러 생성자 필드가 있는 경우 보장되는 이러한 모호한 종속성은 삽입할 수 없으므로 이 필드는 동일한 규정자 세트와 동일한 API 유형을 보유할 수 없습니다.
- 인터셉터 및 데코레이터 오류를 해결하십시오.
문제점 방지: 장애 복구 시나리오에서, @Inject Validator 및 @Inject ValidatorFactory는 지원되지 않습니다. gotcha
- beans.xml 파일에서 또는 @Priority를 통해 인터셉터, 데코레이터 사용 인터셉터 및 데코레이터를 사용으로 설정하십시오. EJB 세션 Bean을 제외한 모든 항목은 Bean의 컨텍스트 인스턴스에만 적용됩니다. 컨텍스트 인스턴스는 @Inject 어노테이션을 사용하거나 BeanManager 인터페이스에서 메소드를 호출하여 얻는 인스턴스입니다.
- 여러 Bean 배치 아카이브(BDA)에서 인터셉터 및 데코레이터. 인터셉터나 데코레이터가 beans.xml 파일을 통해 사용으로 설정되는 경우, 이들 인터셉터나 데코레이터는 해당 아카이브에 대해서만 사용으로 설정됩니다. 인터셉터나 데코레이터가 @Priority를 통해 사용으로 설정되는 경우, 인터셉터나 데코레이터는 전체 애플리케이션에 대해 사용으로 설정됩니다.
- 진단 추적을 사용하여 오류가 발생한 이유를 판별하십시오.
- JCDI=all:com.ibm.ws.cdi*=all:org.jboss.weld*=all을 지정하여 CDI에 대한 추적을 얻으십시오.
- EJBContainer=all:MetaData=all:Injection=all을 지정하여 Java EE 인젝션 및 EJB 컨테이너와의 상호작용을 위한 추가 추적을 얻으십시오.
- all:com.ibm.ws.wswebcontainer*=all을 지정하여 웹 관련 범위 및 라이프사이클과의 상호작용을 위한 추가 추적을 얻으십시오.
- 관리 대상 Bean의 기본 생성자에서 과도한 조작은 피하십시오.
지정된 관리 대상 Bean의 각 인젝션 지점은 프록시를 사용할 때 작성할 수 있는 실제 Bean 인스턴스 외에도 기본 Bean 클래스의 기본 생성자를 호출하는 새 클라이언트 프록시를 수신합니다. 또한 생성자를 완료한 후 종속성 인젝션이 나타나므로 생성자는 삽입된 종속성을 사용할 수 없습니다. 기초 인스턴스에서만 실행하는 인젝션 사후 로직을 넣을 장소에 대해서는 @PostConstruct 어노테이션 라이프사이클 콜백을 참조하십시오.


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tweb_troubleshoot_cdi
파일 이름:tweb_troubleshoot_cdi.html