2011-03-18 3 views
12

와 호환 someClass 나는 XPages 응용 프로그램에서 가끔 예외가 발생했습니다 :의미 someClass

java.lang.ClassCastException: someClass incompatible with someClass. 

이 두 클래스가 같은 언급,이 클래스 세션 빈으로 사용됩니다. 나는 내 문제를 다루는 어떤 것도 할 수 없었다. 이것에 대한 일반적인 설명은 내 경우가 아니라 디자인 요소의 변화였습니다.

그 순간부터 XP 작업 응용 프로그램을 사용할 수 없게됩니다 (session bean someClass 사용). http 작업을 다시 시작하거나 faces-config.xml을 다시 저장할 때까지 사용할 수 없습니다.

com.ibm.jscript.InterpretException: Script interpreter error, line=x, col=y: 
Java method 'method(signature containg someClass)' 
on java class 'someOtherClass' not found 

이 동작 뒤에 무엇이 다른 예외와 관련된 어떤 경우에는

?

+0

아마도 이것은 Serializable 객체에 문제가 있습니까? 원격 통신이 관련되어 있습니까? – Yashima

+0

그건 내 생각 이었지만 이미 IBM의 답변을 넣었습니다. 문제는 XPages에만 해당됩니다. –

+0

백 링크/업데이트 : [link] (http://www-10.lotus.com/ldd/xpagesforum.nsf/topicThread.xsp?action=openDocument&documentId=C7A145A053E99AB5852578C0004D872A) –

답변

14

필립 Riand 이메일로이 explaned :

같은 클래스는 2 개의 다른 클래스 로더에 의해 두 번로드했기 때문에

이 클래스 캐스트가 발생합니다. 따라서 Java 관점에서 보면 서로 다르며 캐스트가 실패합니다.

이제 각 XPage 애플리케이션에는 고유 한 클래스 로더가 있습니다. 그러나이 클래스 로더는 Domino Designer를 통해 응용 프로그램에 대한 설계 변경이 발생할 때마다 삭제됩니다. 이것은 XPages가 이전 Java 클래스 대신로드되어야하는 새 Java 클래스를 생성하도록 변경 될 때 필요합니다. 이 경우 클래스 로더가 삭제되고 새 클래스가 작성됩니다. 그런 다음 모든 응용 프로그램 관련 클래스는 변경되지 않아도 필요에 따라 다시로드됩니다. 이는 J2EE 서버에서 구현되는 일반적인 동작입니다. 즉, 디자인 변경이 발생했을 때 이 아닌이 아닌 스코프에있는 객체를 캐싱하면 코드가 발생합니다. 예를 들어, applicationScope & sessionScope는 현재 디자인 변경이 발생하면 삭제되지 않으므로이 문제가 발생할 수 있습니다. 범위를 폐기하면 때로는 나쁜 개발자 경험을 제공 할 수 있지만 이러한 단점이있는 디자인 방식입니다.

마지막으로 faces-config.xml을 저장하면 문제를 해결할 수 있습니다. 이 파일을 저장하면 범위를 포함하여 전체 모듈이 메모리에서 삭제됩니다. 이유 설명입니다. 사용자 정의 Java 클래스를 변경하려면 모듈을 다시로드하고 문제점을 제거해야합니다.

그래서 bean (심지어 간접적으로)을 sessionScope 또는 applicationScope에 두는 것이 원인입니다.

+0

변수 리졸버 또는 매개 변수로 다른 관리 Bean을 사용하는 Java 객체의 경우에도 마찬가지입니다. 이 Java 객체를 SSJS에서 호출하고 SSJS 코드가 포함 된 XPage를 수정하면 Java 클래스를 수정하거나 프로젝트를 정리하거나 faces-config.xml을 저장할 때까지 오류가 발생합니다. –

+0

템플릿에 faces-config.xml 파일을 저장하면 디자인을 새로 고치는 데이터베이스에서 디자인이 새로 고쳐 지겠습니까? –

+1

@DavidNavarre 정확 : http://stackoverflow.com/questions/20268457/serverside-xpages-application-update-causes-my-browser-page-partial-refresh-acti, http://stackoverflow.com/questions/20268457/serverside-xpages-application-update-causes-my-browser-page-partial-refresh-acti –

5

동일한 클래스 파일이 다른 클래스 로더에로드되는 경우 결과 클래스의 두 Java 클래스는 이 아니며은 같은 클래스입니다. 하나의 인스턴스를 다른 인스턴스를 기대하는 함수로 전달할 수 없습니다. 일반적으로 이런 종류의 문제가 발생하는 경우, 공통 상위 클래스 로더에 표시되지 않는 jar 파일에 액세스 할 수있는 여러 자식 클래스 로더가 있기 때문입니다. "someclass"가 들어있는 jar 파일을 특정 webapp 디렉토리 대신 일반적인 라이브러리 디렉토리로 옮겨야 할 수도 있습니다.

+1

답변은 J2EE에는 100 % 정확하지만 XPages 옵션. XPages 특정 코드를 사용할 때 응용 프로그램 컨텍스트 외부의 클래스 (Domino 서버의 jvm/lib/ext 디렉토리)는 사용할 수 없습니다. –

0

그냥 내 경험을 여기에두고 있습니다.

이 문제를 해결할 때 여러 JVM이있는 CAT 환경에서 내 앱을 실행하고있었습니다. ITG 환경에서 동일한 빌드가 성공적으로 실행 되었기 때문에 CAT에서 두 JVM을 모두 다시 시작 했으므로 오류가 해결되었습니다. 정확히 무엇이 그것을 일으키는 지 확신하지 못합니다.