2017-02-28 6 views
6

응용 프로그램 내부에서 호출하려고하는 SOAP 웹 서비스가 있습니다. 나는 cxf-codegen-plugin (3.1.10)을 사용하여 WSDL에서 소스를 생성한다.ClassCastException : com.sun.xml.internal.bind.v2.runtime.reflect.Accessor로 캐스팅 할 수 없습니다.

생성 된 클라이언트를 사용하여 응용 프로그램 내에서 웹 서비스를 호출하면 멋지게 작동합니다. 그러나 문제를 일으키는 응용 프로그램 내에서 동일한 패키지에 대해 다른 JAXB 인스턴스를 사용하고 있습니다. 바로 전에 새로운 JAXB 인스턴스를 초기화 그러나

OutboundServicePortType service = new OutboundService().getOutboundServicePort(); 
service.sendMessage(message); 

을 실패 할 getOutboundServicePort() 전화를 발생합니다 :

는 예를 들어, 다음은 좋은 작품

다음 스택 트레이스와

JAXBContext.newInstance(SendMessageRequest.class); 

OutboundServicePortType service = new OutboundService().getOutboundServicePort(); 
service.sendMessage(message); 

Caused by: java.lang.ClassCastException: outbound.model.standard.StandardOutboundMessage$JaxbAccessorF_messageUUId cannot be cast to com.sun.xml.internal.bind.v2.runtime.reflect.Accessor 
    at com.sun.xml.internal.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.instanciate(OptimizedAccessorFactory.java:190) 
    at com.sun.xml.internal.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.get(OptimizedAccessorFactory.java:179) 
    at com.sun.xml.internal.bind.v2.runtime.reflect.Accessor$FieldReflection.optimize(Accessor.java:271) 
    at com.sun.xml.internal.bind.v2.runtime.property.SingleElementLeafProperty.<init>(SingleElementLeafProperty.java:77) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) 
    at com.sun.xml.internal.bind.v2.runtime.property.PropertyFactory.create(PropertyFactory.java:113) 
    at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.<init>(ClassBeanInfoImpl.java:166) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getOrCreate(JAXBContextImpl.java:488) 
    at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.<init>(ClassBeanInfoImpl.java:153) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getOrCreate(JAXBContextImpl.java:488) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:305) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:124) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1123) 
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:147) 
    at com.sun.xml.internal.bind.api.JAXBRIContext.newInstance(JAXBRIContext.java:152) 
    at com.sun.xml.internal.bind.api.JAXBRIContext.newInstance(JAXBRIContext.java:96) 
    at com.sun.xml.internal.ws.developer.JAXBContextFactory$1.createJAXBContext(JAXBContextFactory.java:98) 
    at com.sun.xml.internal.ws.db.glassfish.JAXBRIContextFactory.newContext(JAXBRIContextFactory.java:79) 
    ... 25 more 

내가 지금까지 시도한 것들 :

Netbeans with JAXB Random ClassCastException ..cannot be cast to com.sun.xml.bind.v2.runtime.reflect.Accessor

(아래 참조) 내 상황에 대한 작동하지 않을 수와 함께가는 종료
  • 나는 받아 들인 해결책을 시도했다 System.setProperty("com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize", "true"); 어느 일을합니다. 그러나이 환경을 설정하는 것은 불행히도 내 환경에서 나를위한 옵션이 아닙니다. 또한, 실제 문제를 다루지 않는 약간의 해킹 인 것 같습니다 (오해가 아닌 한).

내가 남긴 작은 밧줄로 몸을 지키려고합니다. 내가 여기서 무엇을 놓치고 있니?

+0

답변을 드릴 수는 없지만 링크 된 이해할 수없는 답변에 의해 암시 된 두 개의 클래스 로더처럼 들립니다. 또한 나는 그 noOptimize 옵션에 관한 최소한의 정보를 파헤 칠 수 있었다 : http://cxf.547215.n5.nabble.com/JAXB-is-not-sitting-well-in-an-OSGI -eclipse-env-tp569834p569839.html, jaxb가 정말 이상한 일을하는 것 같아요. 당신이 뭘하고 있는지 확신 할 수 없기 때문에 문제가 발생했습니다. 대답을 얻고 싶습니다. Btw는 jaxb 사용자 메일 링리스트에 아무것도 나타나지 않는지 물어보십시오. –

답변

4

나는 내 자신의 질문에 답하는 것을 싫어하지만 내가 끝내는 해결책이 명확하게 문서화되었는지 확인하고 싶었다.

근본적인 문제는 camel-jaxb에서 가져온 jaxb-impl jar 파일이 JDK 8 제공 버전과 충돌한다는 것입니다.

This answer은 더 명확하게 무슨 일이 일어나고 있는지 설명 : I는 JDK와 함께 제공되는 것보다 새로운 버전으로 JAXB를 업그레이드하려고 할 때

나는 같은 오류가 발생했습니다.Java 런타임에 두 개 이상의 JAXB 인스턴스가 발생하여 에 사용할 버전을 결정할 수 없습니다.

제 경우에는 camel-jaxb와 함께 제공되는 jaxb-impl을 제외하고 응용 프로그램이 올바르게 작동하기 시작했습니다.