ClassCastException: impossible de lancer vers com.soleil.XML.interne.lier.v2.Runtime.refléter.Accesseur

j'ai un service Web SOAP que j'essaie d'appeler à l'intérieur d'une application. J'utilise le cxf-codegen-plugin (3.1.10) pour générer des sources à partir du WSDL.

en utilisant le client généré, si j'appelle le service Web dans l'application, ça marche très bien. Cependant, j'utilise également une autre instance JAXB contre le même paquet dans la demande qui pose problème.

Pour exemple, le code suivant fonctionne très bien:

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

Cependant, initialiser une nouvelle instance JAXB juste avant de provoquer le getOutboundServicePort() appel à l'échec:

JAXBContext.newInstance(SendMessageRequest.class);

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

, Avec stacktrace:

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.createJAXBContext(JAXBContextFactory.java:98)
    at com.sun.xml.internal.ws.db.glassfish.JAXBRIContextFactory.newContext(JAXBRIContextFactory.java:79)
    ... 25 more

Choses que j'ai essayé jusqu'à présent:

JAXB classes de Webservice de triage d'erreur

  • Je n'ai pas de bocaux approuvés dans mon dossier JDK, donc cette réponse ne s'applique pas
  • Le jaxb-impl pot (2.2.11) vient de chameau-jaxb dans mon application il semble donc très contenus et pas comme cette réponse suggère.
  • Cette réponse semble bien décrire le problème, mais la solution qu'ils ont prise me semble peu claire.

Problèmes pour la création de JAXBContext de maréchal de l'objet XML

  • cette question semble être identique à la mienne, mais la solution qu'ils ont fini par aller de l'avant ne peut pas fonctionner pour ma situation (voir ci-dessous)

Netbeans avec JAXB Random ClassCastException ..ne peut pas être envoyé en com.soleil.XML.lier.v2.Runtime.refléter.Accesseur

  • j'ai essayé la solution retenue System.setProperty( "com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize", "true"); travail. Cependant, la définition de cette propriété n'est pas une option pour moi, malheureusement, dans mon environnement. De plus, il semble que c'est un peu un piratage qui ne répond pas au vrai problème (à moins que je ne le comprenne mal).

je suis sur le point de me pendre avec la petite corde qu'il me reste. Ce qui suis Je manque ici?

10
demandé sur Community 2017-02-28 06:05:51

2 réponses

je déteste répondre à ma propre question, mais je voulais m'assurer que la solution que j'ai finalement trouvée était documentée clairement.

le problème fondamental était que le JAXB-impl jar apporté par camel-jaxb était en conflit avec la version fournie par JDK 8.

Cette réponse décrit plus clairement ce qui se passe:

j'ai rencontré la même erreur quand j'ai essayé de mettre à jour JAXB à un nouveau version que ce qui est venu avec le JDK. Java rencontré deux ou plus instances de JAXB à l'exécution et ne pouvait pas décider quelle version à utiliser.

dans mon cas, j'ai simplement exclu le JAXB-impl qui est venu avec camel-JAXB et l'application a commencé à fonctionner correctement.

10
répondu Tyler Murry 2017-05-23 12:09:14

j'ai rencontré le même problème dans le test scope. Pour moi ajouter jaxws-rt jar runtime aidé. Notez que je l'ai ajouté pour ma portée de test seulement. Vous n'allez pas faire cela pour l'exécution prod, puisque JEE container est supposé avoir déjà cette implémentation ou une autre.

<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-rt</artifactId>
    <version>2.2.3</version>
    <scope>test</scope>
</dependency>
0
répondu dpg 2018-07-12 14:11:38