JAXB classes de Webservice de triage d'erreur
J'ai quelques wsimport généré JAXB classes
wsimport -d src/main/java -keep -extension
-p my.package
http://www.OpenLigaDB.de/Webservices/Sportsdata.asmx?WSDL
Je vais vous montrer le problème avec cette classe (seulement le @XmlRootElement a été ajouté par moi-même):
package my.package;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Sport", propOrder = {"sportsID","sportsName"})
@XmlRootElement(name = "sport") //Added by myself
public class Sport
{
protected int sportsID;
protected String sportsName;
public int getSportsID() {return sportsID;}
public void setSportsID(int value) {this.sportsID = value;}
public String getSportsName() {return sportsName;}
public void setSportsName(String value) {this.sportsName = value;}
}
Directement de l'instanciation et de l'ordonnancement fonctionne très bien (Exemple1)
Sport sport = new Sport();
sport.setSportsID(1);
sport.setSportsName("test");
JAXBContext jc = JAXBContext.newInstance(Sport.class);
jc.createMarshaller().marshal(sport,System.out);
Maintenant permet de créer l'objet à l'intérieur d'un webservice appel:
SportsdataSoap s = new Sportsdata().getSportsdataSoap();
ArrayOfSport sports = s.getAvailSports();
for(Sport sport : sports.getSport())
{
JAXBContext jc = JAXBContext.newInstance(Sport.class);
jc.createMarshaller().marshal(sport,System.out);
}
Puis j'ai eu cette exception:
Exception in thread "main" java.lang.ClassCastException: my.package.Sport$JaxbAccessorF_sportsID cannot be cast to com.sun.xml.bind.v2.runtime.reflect.Accessor
at com.sun.xml.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.instanciate(OptimizedAccessorFactory.java:199)
at com.sun.xml.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.get(OptimizedAccessorFactory.java:191)
at com.sun.xml.bind.v2.runtime.reflect.Accessor$FieldReflection.optimize(Accessor.java:282)
at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.<init>(SingleElementNodeProperty.java:94)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.sun.xml.bind.v2.runtime.property.PropertyFactory.create(PropertyFactory.java:128)
at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.<init>(ClassBeanInfoImpl.java:183)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getOrCreate(JAXBContextImpl.java:526)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:341)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1158)
at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:140)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:363)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522)
at my.package.TestOpenLiga.testDisciplines(TestOpenLiga.java:48)
at my.package.TestOpenLiga.main(TestOpenLiga.java:130)
La façon de traiter ce problème? Merci, Thor.
Mise à jour 2 Si je modifie Exemple1 à ceci, j'obtiens la même erreur
SportsdataSoap s = new Sportsdata().getSportsdataSoap();
Sport sport = new Sport();
sport.setSportsID(1);
sport.setSportsName("test");
JAXBContext jc = JAXBContext.newInstance(Sport.class);
jc.createMarshaller().marshal(sport,System.out);
Mise à jour 2 structure XML de sport
<Sport>
<sportsID>int</sportsID>
<sportsName>string</sportsName>
</Sport>
OriginalL'auteur Thor | 2011-05-25
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr si c'est la seule raison pour laquelle cela pourrait se produire, mais c'est un problème que j'ai affronté et résolu comme ceci, vérifiez votre Java approuvé dir et retiré tout en double jaxb-impl.jar. Cela pourrait se produire même avec webservice-api.jar. Espérons que cette aide.
avez-vous vérifié votre \jdk\jre\lib\approuvé?? Vérifiez si vous avez un jaxb.jar il y
Il semble être /Library/Java/Home/lib/approuvé sur OSX, mais ce répertoire est vide.
pourquoi ne pas vous essayez d'ajouter des annotations sur le terrain pour ex:
@XmlAttribute(name = "sportsID", required = true)
sursportsID
et ainsi de suiteLes classes sont créées par wsimport. Je suis à la consommation d'un serveur web, donc ne peut pas modifier la structure (voir mise à Jour 2).
OriginalL'auteur Teja Kantamneni
J'ai eu le même message d'erreur récemment, lorsque j'ai essayé de mettre à niveau JAXB pour une version plus récente que ce qui est venu avec le JDK. J'ai eu une version externe de JAXB, mais mon JAX-WS était encore à l'intérieur de la version fournie avec le JDK. L'intérieur de JAX-WS essayé d'appeler l'interne de JAXB, mais l'application voulu utiliser l'externe JAXB.
Essentiellement, à la fois JAXB et JAX-WS être interne ou les deux doivent être externe. Ce fil a des conseils si vous avez un externe JAXB et que vous souhaitez passer à l'utilisation de la version interne.
OriginalL'auteur Ritzbot
Je sais, cette question est vieux, mais j'ai juste eu un problème similaire et j'ai voulu donner ma solution pour le problème ici.
La question est, que nous avons eu notre propre exemple d'un jaxbcontext dans le même chargeur de classe comme les témoins de jéhovah JAXB contexte résidait dans.
Donc, nous avons ajouté la classe A dans notre JAXB contexte et les témoins de jéhovah ne s'ajouter Une classe dans son JAXB contexte.
Sur l'utilisation des témoins de jéhovah de code, le chargeur de classe a fourni la mauvaise classe, et un classcast exception a été levée.
À l'aide de la JAXB.(onu), maréchal des fonctions de ce "partage" de l'objet, on pourrait résoudre le problème.
Mise à JOUR: Ok, depuis deux demandé, je mettrai à jour cette question après 4 ans 🙂
Le problème décrit ci-dessus pointe vers un chargeur de classe hiérarchique question. JAXB génère la classe de (dé)sérialisation des objets à la volée à partir des annotations et les ajoute à son cache. Ces catégories semblent être identiques au premier abord, mais s'ils sont différents objets de la classe pour les mêmes annotations. Cela fonctionne parce qu'ils ne sont pas dans le même chargeur de classe et les serveurs du chargeur de classe ne sera pas plonger le chargeur de classe de l'arbre à l'autre du chargeur de classe pour les trouver.
Quand on mélange les objets de la partie inférieure du chargeur de classe avec le chargeur de classe d'un niveau hiérarchique supérieur, la formation a été incapable de faire un match.
C'est comment je me souviens de la question.
Je pouvais aussi utiliser quelques éclaircissements sur cette réponse.
OriginalL'auteur thst
je traverse cette erreur, de temps en temps aussi (il n'était pas constant, ô frustrant !!) et je l'ai résolu avec l'aide de ce réponse : - je ajouter de la
httpClientPolicy.setAllowChunking(false);
dans mon code, et \o/, pas plus de problème 🙂Mais, c'est vrai, je ne sais pas pourquoi :/
ClassCastException
erreur.OriginalL'auteur LE GALL Benoît