2017-11-01 26 views
0

Eclipselink의 DescriptorCustomizer for History를 사용할 때 ClassCastException이 발생합니다.Eclipselink의 ClassCastException DescriptorCustomizer

처럼 내 카스타 클래스는 같습니다

public class MyCustomizer implements DescriptorCustomizer { 
    @Override 
    public void customize(ClassDescriptor classDescriptor) thorws Exception { 
     // Setting HistoryPolicy here. 
    } 
} 

엔티티가 주석을 붙일 수 :

@Customizer(full.packagename.MyCustomizer.class)

이이 같은 구조 된 Maven 프로젝트에서 EJB 모듈로 수행됩니다

  • 루트
    • EJB
    • 전쟁

Eclipslink 의존성이다 : 다른 응용 프로그램이없는있는 코드에서는 WebSphere 자유 17.0.0.2에서 실행중인

<dependency> 
    <groupId>org.eclipse.persistence</groupId> 
    <artifactId>eclipselink</artifactId> 
    <version>2.6.3</version> 
    <scope>provided</scope> 
</dependency> 

배치. Eclipselink jar는 서버의 전역 lib 디렉토리에 있습니다.

은 EclipseLink가 먼저 나는 다음과 같은 예외가 발생 엔티티에 액세스하려고 할 때 : 나는 응용 프로그램의 패키지에는 EclipseLink를 포함하려고 노력하지만 결과는 동일

MyCustomizer cannot be cast to org.eclipse.persistence.config.DescriptorCustomizer

. 적절한 캐스팅을 방지 할 수있는 방법과 해결 방법은 무엇입니까? 그것은 WebSphere의 내부를 방해 할 수 없습니다 따라서는 javax.persistence 패키지가 포함되어 있지 않기 때문에

<dependency> 
    <groupId>org.eclipse.persistence</groupId> 
    <artifactId>org.eclipse.persistence.core</artifactId> 
    <version>2.6.3</version> 
    <scope>provided</scope> 
</dependency> 

: 1

편집 # 나는로는 EclipseLink 종속성을 변경했습니다.

테스트 목적으로 응용 프로그램에서 수동 캐스팅을 수행하는 경우 예외가 발생하지 않습니다. ClassCastException는, getCriteriaBuilder()가 EntityManager로 불려 갔을 경우에 Throw됩니다.

답변

0

고통의 몇 시간 후이 문제에 대한 해결 방법이 있습니다 :

응용 프로그램 부분은 확인했다.

다음과 같이 server.xml을 변경해야했습니다. 응용 프로그램의 클래스 로더에 대해 apiTypeVisibility = "spec, ibm-api, 타사"를 추가해야했습니다. 지정된 라이브러리를 사용하고 있었기 때문에이 지정자도 추가해야했습니다. 은 server.xml의

그래서 관련 부분 :

<library id="appLibrary" apiTypeVisibility="spec, ibm-api, third-party"> 
... 
</library> 

<application id="app_ear" ...> 
    <classloader commonLibraryRef="appLibrary" apiTypeVisibility="spec, ibm-api, third-parth"> 
</application>