2013-11-14 4 views
0

ServiceMix를 Apache Felix와 함께 사용하고 엔터프라이즈 응용 프로그램을 여러 번들로 구성합니다. 예를 들어, jpa 엔티티 클래스가있는 번들과 비즈니스 로직 및 DAO 클래스가있는 번들이 있습니다. OpenJPA를 사용하기 때문에 엔티티 번들 프로젝트는 컴파일 타임에 바이트 코드 삽입을 위해 META-INF 폴더에 persistenc.xml이 있어야하지만이 번들은 번들 매니페스트의 메타 - 지속성 헤더에 의해 지속성 단위를 제공합니다. DAO를 제공하는 번들의 내부 내가 blueprint.xml를 사용하여 엔티티 관리자를 주입 :다른 번들에서 jpa 지속성 단위를 사용하는 OSGi?

<bean id="systemUserDAOBean" class="server.daos.SystemUserDAO"> 
    <tx:transaction method="*" value="Required" /> 
    <jpa:context property="entityManager" unitname="mypu" /> 
</bean> 

나는 DAO를 다음과 같은 방법 런타임에 호출하는 경우 :

public SystemUser readSystemUser(String username) { 
     final EntityManager em = getEntityManager(); 
     final Query q = em.createQuery("select a from SystemUser a where a.username = '"+username+"'"); 
     return (SystemUser) q.getSingleResult(); 
} 

는 ClassCastException이 발생합니다 :

java.lang.ClassCastException가 : mypackage.SystemUser이 mypackage.SystemUser 캐스트 할 수없는

내가 지금까지 발견 한 것은, entitymanager 객체를 반환하는 클래스 로더가 반환하는 메소드의 타입을로드 한 클래스 로더와 다르다는 것입니다. 어쩌면 첫 번째 클래스 로더는 엔티티 번들의 클래스 로더이고 두 번째는 번들을 제공하는 DAO의 클래스 로더입니까?

persistence.xml을 DAO-Bundle에 복사하고 blueprint.xml에서 지속성 단위를 사용하면 ClassCastException이 발생하지 않습니다. 하지만이 경우 동일한 응용 프로그램 내에 두 개의 똑같은 persistence.xml 파일이 있습니다. 원하는 것은 없습니다. :(

사람이 어떻게 문제를 해결하는

이 필

감사 아이디어가 않습니다

편집 : 나는 ServiceMix에를 다시 시작하면 내가 지속성 번들을 업데이트 할 때까지 예외가 사라 졌어요 그리고 나는 발견했다. , 두 클래스 로더가 퍼시스턴스 번들에서 온 것임을 알 수있다.

답변

0

도메인 클래스 (여러개의 번들 포함)를 여러 묶음으로 복사 한 것처럼 들리지만, 자바가 발견 한 것처럼 다른 클래스로 다른 클래스 로더에 의해로드 된 같은 클래스 너는 ClassCastException을 얻는다.

Export-Package 헤더를 사용하여 하나의 번들에서 도메인 패키지를 내 보내야합니다. 아마도 이것은 지속성 번들에서 수행되어야합니다. 다른 모든 번들은 해당 패키지를 가져와야합니다.

+0

아니요 복사 된 클래스가 없습니다. 내 "지속성 번들"은 모든 엔티티 클래스를 제공합니다 (Export-Package 기준). –

+0

죄송합니다. 복제본을 계속 찾는 것 외에는 더 이상의 조언을 드릴 수 없습니다. "ClassCastException : X를 X로 캐스트 할 수 없습니다."라는 오류가 표시되면 * 항상 *는 클래스 X가 두 개의 다른 클래스 로더에 의해 개별적으로로드되었음을 의미합니다. Java에서 클래스의 ID는 정규화 된 이름 * 그리고 그것을로드 한 클래스 로더). –

관련 문제