서블릿, JSP 파일, 독립형 프로그램 또는 다른 클라이언트에서 엔터프라이즈 Bean에 액세스할 수 없음
엔터프라이즈 Bean 액세스와 관련된 문제점을 해결할 수 있는 문제점 해결 팁을 사용하십시오.
- java.lang.NoSuchMethodError 메시지
- javax.naming.NameNotFoundException: 액세스를 시도할 때 컨텍스트 "로컬" 메시지에서 이름 name을 찾을 수 없음
- BeanNotReentrantException이 발생합니다.
- CSITransactionRolledbackException / TransactionRolledbackException이 발생합니다.
- 호출 실패, EJSContainer E Bean method threw exception [exception_name]으로 시작하는 스택 추적 이 JVM 로그 파일에 있습니다.
- 호출 실패, Stateful 세션 EJB에 액세스할 때 ObjectNotFoundException 또는 ObjectNotFoundLocalException이 JVM 로그 파일에 있습니다.
- EJB 모듈 시작 시도가 "javax.naming.NameNotFoundException dataSourceName_CMP" 예외로 실패함
트랜잭션 [tran ID]가 EJB에 액세스하는 동안 120초 후 제한시간을 초과했습니다.
메시지 BBOT0003W가 발행됨
- 증상: CNTR0001W: Stateful SessionBean을 비활성화할 수 없음
증상: org.omg.CORBA.BAD_PARAM: 하위(servant)의 유형이 예상 유형이 아닙니다. 부 코드: 4942F21E 완료: EJB 메소드를 실행하려는 중 아니오가 클라이언트 프로그램으로 리턴됨
클라이언트가 다른 Application Server에서,
또는 독립형 클라이언트로서 실행 중임을 의미하는 엔터프라이즈 Bean에 대해
원격인 경우, 클라이언트의 로그 파일은 물론 엔터프라이즈 Bean을 호스트하는
Application Server의 JVM
로그를 찾아보십시오.
클라이언트가 다른 Application Server에서,
또는 독립형 클라이언트로서 실행 중임을 의미하는 엔터프라이즈 Bean에 대해
원격인 경우, 클라이언트의 로그 파일은 물론 엔터프라이즈 Bean을 호스트하는
Application Server의 로그를 찾아보십시오.
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
- 네임 서비스 관련 문제점인 경우, NameNotFoundException 오류 또는 NMSV로 시작하는 메시지 ID가 표시됩니다. 자세한 정보는 다음 주제를 참조하십시오.
- 문제 진단 및 수정: 학습 자원에 있는 링크를 사용하여 문제를 식별하고 문서화했는지 확인하십시오.
java.lang.NoSuchMethodError
세션 Bean에서 메소드를 호출하려고 시도할 때 java.lang.NoSuchMethodError가 발생했습니다.
When trying to invoke the method xSLTStory4Session on a bean, a java.lang.NoSuchMethodError displayed.
CNTR0020E: EJB threw an unexpected (non-declared) exception during invocation of method "xSLTStory4Session"
on bean "BeanId(ERWW_v8#XSLTStory4SessionEJB3.jar#XSLTStory4SessionFacadeBean, null)".
Exception data: java.lang.NoSuchMethodError: paysession/ejb3/PaySessionFacadeRemote.
paySession(Ljava/lang/String;)Ljava/lang/String;
이 경우 EAR 파일 내에 다중 모듈에 다중 버전의 PaySessionFacadeRemote 인터페이스가 있습니다. 이러한 인터페이스 중 하나는 예상 메소드를 포함하지 않습니다.
EAR 파일의 클래스 경로에서 잘못된 버전인 PaySessionFacadeRemote 인터페이스의 첫 번째 버전으로부터 런타임에 의해 스텁 클래스가 생성되었습니다.
Stateful 세션 EJB에 액세스할 때 ObjectNotFoundException 또는 ObjectNotFoundLocalException
이 문제점의 가능한 원인은 Stateful 세션 Bean이 제한시간을 초과했고 컨테이너에 의해 제거되었기 때문입니다. 이 이벤트는 EJB 2.1 이상 스펙에 따라 코드에 주소 지정되어야 합니다. EJB 2.1 및 3.0 스펙은 http://java.sun.com/products/ejb/docs.html에서 검토할 수 있습니다.
"EJSContainer E Bean method threw exception [exception_name]"으로 시작되는 스택 추적이 JVM 로그 파일에 있음
예외 이름이 "com.ibm..."으로 시작되는 IBM 클래스에 의해 예외 처리(throw)된 예외를 표시하는 경우 설명한 대로 Information Center 및 온라인 도움말에서 예외 이름을 검색하십시오. "예외 이름"이 사용자 애플리케이션에 의해 발생한 예외를 표시하는 경우, 애플리케이션 개발자에게 문의하여 이 오류의 원인을 판별하십시오.
javax.naming.NameNotFoundException: Name 이름을 컨텍스트 "로컬"에서 찾을 수 없음
이 예외가 발생하게 된 원인은 엔터프라이즈 Bean이 클라이언트 JSP, Servlet, Java 애플리케이션 또는 기타 엔터프라이즈 Bean에 대해 로컬이 아니지만(동일한 JVM이나 Application Server에서 실행되고 있지 않음) 호출이 엔터프라이즈 Bean의 "로컬" 인터페이스 메소드에 대한 것이기 때문일 수 있습니다. 개발 환경에서 액세스가 작동되지만 WebSphere Application Server로 배치할 때 작동되지 않을 경우에는 예를 들어, 엔터프라이즈 Bean과 해당 클라이언트가 개발 시에 동일한 JVM에 있었지만 배치 후에는 별도의 프로세스에 있을 수 있습니다.
이러한 문제점을 해결하려면 엔터프라이즈 Bean의 개발자에게 문의하여 클라이언트 호출이 엔터프라이즈 Bean 로컬 인터페이스의 메소드에 대한 것인지 판별하십시오. 이 경우, 클라이언트 코드를 원격 인터페이스 메소드를 호출하도록 변경하거나 로컬 메소드를 원격 인터페이스로 승격시킵니다.
로컬 인터페이스에서 Enterprise Bean에 대한 참조는 로컬의
URL 설계에서 서버 프로세스에 로컬인 네임스페이스로 바인드됩니다. 서버 local:
네임스페이스의 덤프를 얻으려면 "Namespace dump utility for java:, local: and server namespaces" 문서에서 설명하는 네임스페이스 덤프 유틸리티를 사용하십시오.
BeanNotReentrantException이 발생합니다.
이러한 문제점은 두 개의 다른 클라이언트 스레드에서 동일한 Stateful 세션 Bean을 호출하려고 하는 서블릿 또는 JSP 파일 등의 클라이언트 코드로 인해 발생할 수 있습니다. 이 상황은 애플리케이션이 Stateful 세션 Bean에 대한 참조를 정적 변수에 저장하거나 글로벌(정적) JSP 변수를 사용하여 Stateful 세션 Bean 참조사항을 참조하거나 Stateful 세션 Bean 참조사항을 HTTP 세션 오브젝트에 저장할 때 발생합니다. 그러면 애플리케이션은 이전 요청이 완료되기 전에 클라이언트 브라우저가 Servlet이나 JSP 파일에 대한 새 요청을 발행하도록 합니다.
이 문제점을 해결하려면 클라이언트 코드의 개발자에게 이러한 상태에 대한 코드를 검토할 것을 요청하십시오.
CSITransactionRolledbackException / TransactionRolledbackException이 발생합니다.
엔터프라이즈 Bean 컨테이너는
엔터프라이즈 Bean 호출이 완료되지 않음을 표시하기 위해
이러한 상위 레벨 예외를 작성합니다. 이 예외가 발생하면 JVM 로그를 찾아보고 기본 원인을 판별하십시오.
엔터프라이즈 Bean 컨테이너는
엔터프라이즈 Bean 호출이 완료되지 않음을 표시하기 위해
이러한 상위 레벨 예외를 작성합니다. 이 예외가 발생하면 로그를 찾아보고 기본 원인을
판별하십시오.
- 엔터프라이즈 Bean이 메소드 서명의 일부로 선언되지 않은 예외를 발생시킬 수 있습니다. 이 경우 컨테이너가 트랜잭션을 롤백해야 합니다. 이러한 상황을 일으키는 공통적인 원인은 엔터프라이즈 Bean 또는 이 Bean이 호출하는 코드가 NullPointerException, ArrayIndexOutOfBoundsException 또는 기타 Java 런타임 예외를 작성하는 경우이거나 BMP Bean에서 JDBC 오류가 발견되는 경우입니다. 해결 방법은 엔터프라이즈 Bean 코드를 조사하고 기본 예외를 해결하거나 예외를 문제 메소드의 서명에 추가하는 것입니다.
- 트랜잭션이 "Marked Rollback", "RollingBack" 또는 "RolledBack" 상태에 배치된 후에 추가 작업을 수행하려고 시도할 수 있습니다. 트랜잭션은 이러한 상태 중 하나로 설정된 후에는 작업을 계속할 수 없습니다. 이러한 상황은 트랜잭션이 제한시간을 초과했기 때문에 발생하며, 종종 데이터베이스 교착 상태 때문에 발생합니다. 애플리케이션 데이터베이스 관리 도구 또는 관리자에 대한 작업에서는 엔터프라이즈 Bean에서 호출한 데이터베이스 트랜잭션의 제한시간 초과 여부를 판별합니다.
- 트랜잭션은 로컬 트랜잭션의 남아 있는 작업으로 인해 커미트할 수 없습니다. 로컬 트랜잭션에서 커미트 중 일부 "남아 있는 작업"이 발생합니다. 로컬 트랜잭션에 "해결되지 않은 조치"가 발생하면 기본 조치는 "롤백"하는 것입니다. 어셈블리 도구에서 이 조치를 "커미트"로 조정할 수 있습니다. 어셈블리 도구를 사용하는 방법에 대한 자세한 정보는 어셈블리 도구 Information Center를 참조하십시오.
EJB 모듈을 시작하려는 시도가 "javax.naming.NameNotFoundException dataSourceName_CMP" 예외로 실패함
- 데이터 소스 자원이 구성될 때, CMP가 선택되지 않았습니다.
- 이 문제점을 확인하려면 관리 콘솔에서 NameNotFoundException에 지정된 데이터 소스의 특성을 찾아보십시오. 구성 패널에서 Container Managed Persistence로 레이블 지정된 선택란을 검색하십시오.
- 이러한 문제점을 정정하려면 CMP 선택란을 선택하십시오.
- CMP가 선택된 경우, CMP 데이터 소스가 네임스페이스로 바인드되지
않았을 수 있습니다.
상태 표시줄 및 호스트하는 Application Server JVM 로그에서 추가 이름 경고나 오류를 찾아보십시오. 애플리케이션 액세스 문제점 주제를 보고 추가 네이밍 예외 문제점을 점검하십시오.
상태 표시줄 및 호스트하는 Application Server 로그에서 추가 이름 경고나 오류를 찾아보십시오. 애플리케이션 액세스 문제점 주제를 보고 추가 네이밍 예외 문제점을 점검하십시오.
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
트랜잭션 [tran ID]가 엔터프라이즈 Bean 액세스 중 120초 후에 제한시간에 도달했습니다.
- 엔터프라이즈 Bean 트랜잭션의 기본 제한시간 값은 120초입니다. 이후로는 트랜잭션이 제한시간을 초과하므로 연결이 닫힙니다.
- 트랜잭션이 합법적으로 지정된 제한시간보다 오래 걸리는 경우, server_name으로 이동하여 트랜잭션 서비스 특성 페이지를 선택하고 특성 전체 트랜잭션 지속 시간 제한시간을 찾아보십시오. 필요할 경우 이 값을 증가시키고 구성을 저장하십시오.
![[z/OS]](../images/ngzos.gif)
메시지 BBOT0003W가 발행됨
- 엔터프라이즈 Bean 트랜잭션의 기본 제한시간 값은 120초입니다. 이후로는 트랜잭션이 제한시간을 초과하므로 연결이 닫힙니다.
- 트랜잭션이 지정된 제한시간 기간보다 정당하게 오래 걸리는 경우,
관리 콘솔에서 다음을 수행하십시오.
- 으로 이동
- 트랜잭션 서비스 특성 페이지 선택
- 총 트랜잭션 지속 시간 제한시간 값 증대
- 구성 저장
참고: z/OS는 총 트랜잭션 지속 시간의 제한시간에 설정한 값을 기본 트랜잭션 제한시간 설정값으로 사용합니다. 이 특성을 최대 트랜잭션 제한시간 값보다 큰 값으로 설정하면, z/OS는 최대 트랜잭션 제한시간 값을 기본값으로 사용합니다.
증상:CNTR0001W: Stateful SessionBean을 비활성화할 수 없습니다.
이 오류는 Bean에서 사용 중인 연결 오브젝트가 닫히지 않았거나 널인 경우 발생할 수 있습니다.
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
[time EDT] <ThreadID> StatefulPassi W CNTR0001W:
A Stateful SessionBean could not be passivated: StatefulBeanO
(BeanId(XXX#YYY.jar#ZZZZ, <ThreadID>),
state = PASSIVATING) com.ibm.ejs.container.passivator.StatefulPassivator@<ThreadID>
java.io.NotSerializableException: com.ibm.ws.rsadapter.jdbc.WSJdbcConnection
at java.io.ObjectOutputStream.outputObject((Compiled Code))
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code))
at java.io.ObjectOutputStream.outputClassFields((Compiled Code))
at java.io.ObjectOutputStream.defaultWriteObject((Compiled Code))
at java.io.ObjectOutputStream.outputObject((Compiled Code))
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code))
at com.ibm.ejs.container.passivator.StatefulPassivator.passivate((Compiled Code))
at com.ibm.ejs.container.StatefulBeanO.passivate((Compiled Code)
at com.ibm.ejs.container.activator.StatefulASActivationStrategy.atUnitOfWorkEnd
((Compiled Code))
at com.ibm.ejs.container.activator.Activator.unitOfWorkEnd((Compiled Code))
at com.ibm.ejs.container.ContainerAS.afterCompletion((Compiled Code)
여기서 XXX,YYY,ZZZ는 Bean 이름이고
<ThreadID>는 실행되는 스레드 ID입니다.![[z/OS]](../images/ngzos.gif)
StatefulPassi W CNTR0001W:
A Stateful SessionBean could not be passivated: StatefulBeanO
(BeanId(XXX#YYY.jar#ZZZZ),
state = PASSIVATING)
java.io.NotSerializableException: com.ibm.ws.rsadapter.jdbc.WSJdbcConnection
at java.io.ObjectOutputStream.outputObject((Compiled Code))
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code))
at java.io.ObjectOutputStream.outputClassFields((Compiled Code))
at java.io.ObjectOutputStream.defaultWriteObject((Compiled Code))
at java.io.ObjectOutputStream.outputObject((Compiled Code))
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code))
at com.ibm.ejs.container.passivator.StatefulPassivator.passivate((Compiled Code))
at com.ibm.ejs.container.StatefulBeanO.passivate((Compiled Code)
at com.ibm.ejs.container.activator.StatefulASActivationStrategy.atUnitOfWorkEnd
((Compiled Code))
at com.ibm.ejs.container.activator.Activator.unitOfWorkEnd((Compiled Code))
at com.ibm.ejs.container.ContainerAS.afterCompletion((Compiled Code)
여기서 XXX,YYY,ZZZ는 Bean 이름입니다.이러한 문제점을 정정하려면 애플리케이션이 모든 연결을 닫고 모든 연결에 대해 참조를 널로 설정해야 합니다. 일반적으로, 이 활동은 Bean의 ejbPassivate() 메소드에서 수행됩니다. 또한 Bean이 재활성화될 때 이 연결을 다시 확보하기 위해 Bean을 코드화해야 합니다. 그렇지 않으면, 애플리케이션이 연결을 다시 사용하려 할 때 NullPointerExceptions이 발생합니다.
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
Symptom: org.omg.CORBA.BAD_PARAM: Servant is not of the expected type. minor code: 4942F21E completed: No
클라이언트 프로그램이 EJB 메소드를 실행하려고 할 때 이 오류를 리턴받는 경우가 있습니다.
일반적으로, 이 문제점은 클라이언트 및 서버 설치에서 인터페이스 정의와 구현 간의 불일치로 발생합니다.
가능한 다른 원인으로는 Application Server가 단일 클래스 로딩 설계를 사용하도록 설정되었기 때문입니다. Application Server가 활성인 상태에서 어떤 애플리케이션을 설치 제거했다면, 설치 제거된 애플리케이션의 클래스가 여전히 Application Server에 로드된 상태로 남아 있게 됩니다. 애플리케이션을 변경하고, Application Server에 다시 배치하거나 다시 설치하는 경우, 이전에 로드된 클래스는 이전 레벨이 됩니다. 이전 레벨의 클래스는 클라이언트와 서버 사이에 코드 버전 불일치를 일으킵니다.
- Application Server 클래스 로딩 설계를 multiple로 변경하십시오.
- Application Server를 중지했다가 다시 시작한 후 조작을 다시 시도하십시오.
- 클라이언트 및 서버 코드 버전이 동일한지 확인하십시오.