JAXB versucht abstrakte Klasse zu erzeugen

minos5000

Aktives Mitglied
Hi,

ich habe eine Menge von Schemas in denen u.A. folgende Typen definiert sind.

[XML]
<xsd:complexType name="CT_Objekt" abstract="true">
<xsd:sequence>
<xsd:element name="Erweiterung" type="CT_Erweiterung" minOccurs="0" maxOccurs="1" nillable="true"/>
</xsd:sequence>
</xsd:complexType>

<xsd:complexType name="CT_Erweiterung" abstract="true">
<xsd:sequence/>
</xsd:complexType>

<xsd:complexType name="CT_Filter" abstract="true">
<xsd:complexContent>
<xsd:extension base="allgemein:CT_Objekt">
<xsd:sequence/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="CT_Suche">
<xsd:complexContent>
<xsd:extension base="kontext:CT_Filter">
<xsd:sequence>
<xsd:element name="Nummer" type="daten:ST_Text030" minOccurs="0" maxOccurs="1" nillable="true">
</xsd:element>
....
....
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>[/XML]

Ich habe mit xjc die entsprechenden Java-Klassen generiert und stehe jetzt vor dem Problem, dass beim Instanziieren eines CT_Suche-Objektes immer auch versucht wird, eine Instanz von CT_Erweiterung zu erzeugen, was natürlich fehlschlägt, da dieser Typ abstrakt ist.

Die Frage die ich mir stelle ist, wo liegt hier der Fehler. Hätte der Schreiber der Schemas CT_Erweiterung nicht abstrakt definieren dürfen oder sollte JAXB so schlau sein zu merken, dass ein Objekt des Typs nicht erzeugt werden darf?

Gruß
minos
 
Das sollte nicht so sein. Wie sieht denn der generierte Code aus? Ich habe Dein Snippet mal genommen und xjc (version 2.2.4-2) gegeben. In CTSuche wird nicht versucht, CTFilter zu instanziieren. Ich kann auch erfolgreich (un)marshallen.
 
Hmm, eigenartig. Der generierte Code sieht bei mir so aus

Java:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "CT_Partnersuche", propOrder = {...})
public class CTPartnersuche
    extends CTFilter
{ }

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "CT_Filter")
@XmlSeeAlso({
    CTPartnersuche.class
})
public abstract class CTFilter
    extends CTObjekt
{ }

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "CT_Objekt", propOrder = { "erweiterung" })
@XmlSeeAlso({
...
    CTFilter.class,
...
})
public abstract class CTObjekt {

    @XmlElementRef(name = "Erweiterung", namespace = "http://www.bipro.net/namespace/allgemein", type = JAXBElement.class)
    protected JAXBElement<CTErweiterung> erweiterung;
...
}

Ich habe die WSDL die die Schemas referenziert in SoapUI importiert, eine Anfrage mit CTPartnersuche losgeschickt und dann scheppert es wegen besagtem "abstract".
 
Ok, so ähnlich sieht der Code bei mir auch aus. Wie gesagt, ich konnte erfolgreich (un)marshallen. Kann es sich um einen SoapUI-Bug handeln?
 
Ok, ich habe bei der Suche nach etwas anderem zufällig wahrscheinlich die Lösung für Dein Problem gefunden: Release Notes

JAXB-890 passt genau auf Deine Beschreibung. Ein Update auf 2.2.6 sollte also helfen.
 
Guten Tag,
Obwohl ich die neueste JDK-Version benutze (1.7.0_11) und JAXB Version 2.2.6 in Maven referenziere, habe ich auch Probleme beim Unmarshalling:
Java:
18.01.2013 15:50:56 WARN  o.a.cxf.phase.PhaseInterceptorChain - Interceptor for {http://www.bipro.net/namespace}KrankenService_2.1.0.1.0#{http://www.bipro.net/namespace}getOffer has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Unmarshalling Error: unerwartetes Element (URI:"", lokal:"value"). Erwartete Elemente sind (none) 
	at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:808) ~[cxf-rt-databinding-jaxb-2.7.1.jar:2.7.1]
	at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:629) ~[cxf-rt-databinding-jaxb-2.7.1.jar:2.7.1]
	at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:157) ~[cxf-rt-databinding-jaxb-2.7.1.jar:2.7.1]
	at org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:102) ~[cxf-api-2.7.1.jar:2.7.1]
	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271) ~[cxf-api-2.7.1.jar:2.7.1]
	at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) [cxf-api-2.7.1.jar:2.7.1]
	at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:238) [cxf-rt-transports-http-2.7.1.jar:2.7.1]
	at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:218) [cxf-rt-transports-http-2.7.1.jar:2.7.1]
	at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:163) [cxf-rt-transports-http-2.7.1.jar:2.7.1]
	at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:137) [cxf-rt-transports-http-2.7.1.jar:2.7.1]
	at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:158) [cxf-rt-transports-http-2.7.1.jar:2.7.1]
	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:243) [cxf-rt-transports-http-2.7.1.jar:2.7.1]
	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:163) [cxf-rt-transports-http-2.7.1.jar:2.7.1]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) [servlet-api.jar:na]
	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:219) [cxf-rt-transports-http-2.7.1.jar:2.7.1]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) [catalina.jar:7.0.29]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [catalina.jar:7.0.29]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225) [catalina.jar:7.0.29]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) [catalina.jar:7.0.29]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) [catalina.jar:7.0.29]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) [catalina.jar:7.0.29]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) [catalina.jar:7.0.29]
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) [catalina.jar:7.0.29]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) [catalina.jar:7.0.29]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) [catalina.jar:7.0.29]
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001) [tomcat-coyote.jar:7.0.29]
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) [tomcat-coyote.jar:7.0.29]
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) [tomcat-coyote.jar:7.0.29]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [na:1.7.0_11]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) [na:1.7.0_11]
	at java.lang.Thread.run(Thread.java:722) [na:1.7.0_11]
Caused by: javax.xml.bind.UnmarshalException: null
	at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:435) ~[jaxb-impl-2.2.6.jar:2.2.6]
	at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:372) ~[jaxb-impl-2.2.6.jar:2.2.6]
	at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:349) ~[jaxb-impl-2.2.6.jar:2.2.6]
	at org.apache.cxf.jaxb.JAXBEncoderDecoder.doUnmarshal(JAXBEncoderDecoder.java:769) ~[cxf-rt-databinding-jaxb-2.7.1.jar:2.7.1]
	at org.apache.cxf.jaxb.JAXBEncoderDecoder.access$100(JAXBEncoderDecoder.java:94) ~[cxf-rt-databinding-jaxb-2.7.1.jar:2.7.1]
	at org.apache.cxf.jaxb.JAXBEncoderDecoder$1.run(JAXBEncoderDecoder.java:797) ~[cxf-rt-databinding-jaxb-2.7.1.jar:2.7.1]
	at java.security.AccessController.doPrivileged(Native Method) ~[na:1.7.0_11]
	at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:795) ~[cxf-rt-databinding-jaxb-2.7.1.jar:2.7.1]
	... 30 common frames omitted
Caused by: com.sun.istack.SAXParseException2: unerwartetes Element (URI:"", lokal:"value"). Erwartete Elemente sind (none)
	at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:662) ~[jaxb-impl-2.2.6.jar:2.2.6]
	at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:258) ~[jaxb-impl-2.2.6.jar:2.2.6]
	at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:253) ~[jaxb-impl-2.2.6.jar:2.2.6]
	at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:120) ~[jaxb-impl-2.2.6.jar:2.2.6]
	at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.childElement(Loader.java:105) ~[jaxb-impl-2.2.6.jar:2.2.6]
	at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:498) ~[jaxb-impl-2.2.6.jar:2.2.6]
	at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:480) ~[jaxb-impl-2.2.6.jar:2.2.6]
	at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.handleStartElement(StAXStreamConnector.java:246) ~[jaxb-impl-2.2.6.jar:2.2.6]
	at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:180) ~[jaxb-impl-2.2.6.jar:2.2.6]
	at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:370) ~[jaxb-impl-2.2.6.jar:2.2.6]
	... 36 common frames omitted
Caused by: javax.xml.bind.UnmarshalException: unerwartetes Element (URI:"", lokal:"value"). Erwartete Elemente sind (none)
	... 46 common frames omitted

Hat jemand eine Idee woran das liegen kann?
Zur Generierung der Klassen und Bereitstellung des WebServices benutze ich Apache CXF (Version 2.7.1).
 
Hallo Dan88,

wenn Du ein neues Problem hast, mache bitte lieber einen neuen Thread auf, anstatt irgend einen mehr oder weniger passenden zu kapern. Das erhöht die Chancen auf Antwort, hält Ordnung und erleichtert eine eventuelle Suche nach bestimmten Problemen im Forum.

Dein Problem sieht nicht so aus, als würde da versucht, eine abstrakte Klasse zu instanziieren. So weit scheint er garnicht zu kommen. Das hier:
Code:
Unmarshalling Error: unerwartetes Element (URI:"", lokal:"value"). Erwartete Elemente sind (none)
deutet darauf hin, dass das geparste XML invalide ist. Was genau, kannst im Moment nur Du sagen. Von uns kennt keiner das XML, geschweige denn ein evtl. vorhandenes Schema.
 

Zurück
Oben