JAXB-Klassen von Webservice-marshalling Fehler
Habe ich einige wsimport generiert JAXB-Klassen
wsimport -d src/main/java -keep -extension
-p my.package
http://www.OpenLigaDB.de/Webservices/Sportsdata.asmx?WSDL
Werde ich zeigen, das problem mit dieser Klasse (es werden nur die @XmlRootElement wurde Hinzugefügt von mir):
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;}
}
Direkt Instanzierung und marshalling funktioniert gut (Beispiel1)
Sport sport = new Sport();
sport.setSportsID(1);
sport.setSportsName("test");
JAXBContext jc = JAXBContext.newInstance(Sport.class);
jc.createMarshaller().marshal(sport,System.out);
Nun erstellen wir das Objekt innerhalb eines webservice-Aufruf:
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);
}
Dann bekam ich diese 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)
Umgang mit diesem? Danke, Thor.
Update 2 Wenn ich ändern Beispiel1 dieser, bekomme ich den gleichen Fehler
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);
Update 2 XML-Struktur des Sports
<Sport>
<sportsID>int</sportsID>
<sportsName>string</sportsName>
</Sport>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin nicht sicher, ob dies der einzige Grund, warum dies passieren könnte, aber das ist ein problem, das ich konfrontiert und gelöst wie diesen, überprüfen Sie Ihre Java endorsed dir und entfernt alle doppelten jaxb-impl.jar. Dies könnte passieren, auch mit webservice-api.jar. Hoffe, das hilft.
@XmlAttribute(name = "sportsID", required = true)
aufsportsID
und so weiterBekam ich die gleiche Fehlermeldung kürzlich, als ich versuchte, zu aktualisieren, JAXB, um eine neuere version als das, was kam mit dem JDK. Ich hatte eine externe version von JAXB, aber mein JAX-WS wurde noch die interne version, die kam mit dem JDK. Die interne JAX-WS versucht, den Aufruf der internen JAXB, aber das Programm wollte die externe JAXB.
Im wesentlichen, sowohl JAXB und JAX-WS haben, um intern oder beide extern. Dieser thread hat sich beraten, wenn Sie eine externe JAXB und der Sie wechseln möchten, mit der internen version.
Ich weiß, diese Frage ist alt, aber ich hatte gerade ein ähnliches Problem und ich wollte meine Lösung für das problem hier.
Das Problem war, dass wir hatten unsere eigene Instanz des jaxbcontext in der selben classloader wie den Zeugen Jehovas, die JAXB-Kontext war es, die Ihren Wohnsitz in.
Damit wir noch die Klasse A in unserer JAXB-Kontext und die Zeugen Jehovas haben Klasse hinzufügen Ein in seiner JAXB-Kontext.
Auf die mithilfe der Zeugen Jehovas-code, der classloader hatte die falsche Klasse, und eine classcast exception geworfen wurde.
Mithilfe des JAXB.(un)Marshallen Funktionen für diese "shared" - Objekt, könnten wir das Problem lösen.
UPDATE: Ok, seit zwei gefragt, werde ich auf diese Frage nach 4 Jahren 🙂
Das oben beschriebene Problem weist auf eine hierarchische classloader-Problem. JAXB erzeugt eine Klasse (un -) marshalling von Objekten auf dem Flug von Anmerkungen auf und fügt Sie zu seinem cache. Diese Klassen scheinen identisch zu sein auf den ersten, aber Sie sind unterschiedliche class-Objekte für die gleichen Anmerkungen. Dies funktioniert, weil Sie nicht in der selben classloader und die Server-classloader nicht Tauchen unten die classloader-Struktur, um den anderen classloader, um Sie zu finden.
Wenn wir gemischt wird, bis die Objekte aus dem unteren classloader mit dem classloader, der weiter oben in der Hierarchie, die Lotsen nicht in der Lage war um ein Spiel zu machen.
Das ist, wie ich erinnere mich an das Problem.
Kreuz ich diesen Fehler Zeit zu Zeit auch (es war nicht konstant, ô frustrierend !!) und ich beschloss, dass ich es mit Hilfe dieser Antwort : ich füge die
httpClientPolicy.setAllowChunking(false);
in meinem code, und \o/, kein problem mehr 🙂Aber wahr, ich weiß nicht warum :/
ClassCastException
Fehler.