2012-02-06 1 views
2

Je me bats avec un problème étrange depuis plusieurs jours. Un client fournit un service Web et un WSDL. J'ai importé le WSDL en utilisant wsimport et une personnalisation de jaxb. Toutes les classes Java sont générées sans aucune erreur.JAXB: Unmarshaller essaie d'instancier une classe abstraite (en ignorant xsi: type)

Lorsque j'utilise les classes Java pour unmarshall une réponse que je suis l'exception suivante:

06.02.2012 09:18:50 com.sun.xml.bind.v2.ClassFactory create 
INFO: failed to create a new instance of class net.bipro.v2_1_0_1_0.namespace.datentypen.STEGefahr 
java.lang.InstantiationException 
    at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:30) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at com.sun.xml.bind.v2.ClassFactory.create0(ClassFactory.java:122) 
    at com.sun.xml.bind.v2.ClassFactory.create(ClassFactory.java:131) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.createInstance(UnmarshallingContext.java:609) 
    at com.sun.xml.bind.v2.model.impl.RuntimeClassInfoImpl$TransducerImpl.parse(RuntimeClassInfoImpl.java:392) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.TextLoader.text(TextLoader.java:69) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.text(UnmarshallingContext.java:514) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.processText(SAXConnector.java:181) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.endElement(SAXConnector.java:154) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:601) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2939) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:217) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:189) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:142) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:151) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:169) 
    at de.company.bipro.tarifierung.TestApp.<init>(TestApp.java:39) 
    at de.company.bipro.tarifierung.TestApp.main(TestApp.java:143) 

I réduit l'objet de réponse à un xml valide minimale:

<taa:getQuoteResponse 
    xmlns:taa="http://www.bipro.net/namespace/tarifierung" 
    xmlns:leben="http://www.bipro.net/namespace/leben" 
    xmlns:sachen="http://www.bipro.net/namespace/sachen" 
    xmlns:haftpflicht="http://www.bipro.net/namespace/haftpflicht" 
    xmlns:fahrzeug="http://www.bipro.net/namespace/fahrzeug" 
    xmlns:xyzkfz="http://www.xyz.de/kfz/namespace" 
    xmlns:xyz-komposit="http://www.xyz.de/komposit/namespace" 
    xmlns:sach="http://www.bipro.net/namespace/sach" 
    xmlns:xyzleben="http://www.xyz.de/leben/namespace" 
    xmlns:xyz="http://www.xyz.de/namespace" 
    xmlns:partner="http://www.bipro.net/namespace/partner" 
    xmlns:mime="http://www.w3.org/2005/05/xmlmime" 
    xmlns:komposit="http://www.bipro.net/namespace/komposit" 
    xmlns:kfz="http://www.bipro.net/namespace/kraftfahrt" 
    xmlns:allgemein="http://www.bipro.net/namespace/allgemein"> 
    <taa:Response>  
    <taa:Tarifierung>  
     <taa:Verkaufsprodukt>   
     <taa:Produkt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="komposit:CT_SUHVersicherung">   
      <taa:Elementarprodukt xsi:type="komposit:CT_Deckung">    
      <komposit:Gefahr xmlns:daten="http://www.bipro.net/namespace/datentypen" xsi:type="daten:STE_GefahrBasis">L</komposit:Gefahr>    
      </taa:Elementarprodukt> 
     </taa:Produkt> 
     </taa:Verkaufsprodukt>  
    </taa:Tarifierung> 
    </taa:Response> 
</taa:getQuoteResponse> 

Voici le type de données définition:

<xsd:complexType abstract="true" name="STE_Gefahr"> 
    <xsd:simpleContent> 
     <xsd:extension base="xsd:string"/> 
    </xsd:simpleContent> 
</xsd:complexType> 

<xsd:complexType final="#all" name="STE_GefahrBasis"> 
    <xsd:simpleContent> 
     <xsd:restriction base="daten:STE_Gefahr"> 
      <xsd:enumeration value="F"><xsd:annotation><xsd:documentation>Feuer</xsd:documentation></xsd:annotation></xsd:enumeration> 
      <xsd:enumeration value="L"><xsd:annotation><xsd:documentation>Leitungswasser</xsd:documentation></xsd:annotation></xsd:enumeration> 
      <xsd:enumeration value="S"><xsd:annotation><xsd:documentation>Sturm</xsd:documentation></xsd:annotation></xsd:enumeration> 
      <xsd:enumeration value="H"><xsd:annotation><xsd:documentation>Hagel</xsd:documentation></xsd:annotation></xsd:enumeration> 
      <xsd:enumeration value="E"><xsd:annotation><xsd:documentation>Einbruchdiebstahl</xsd:documentation></xsd:annotation></xsd:enumeration> 
      <xsd:enumeration value="G"><xsd:annotation><xsd:documentation>Glas</xsd:documentation></xsd:annotation></xsd:enumeration> 
      <xsd:enumeration value="U"><xsd:annotation><xsd:documentation>Ueberspannungsschaeden</xsd:documentation></xsd:annotation></xsd:enumeration> 
      <xsd:enumeration value="N"><xsd:annotation><xsd:documentation>Nutzfeuer</xsd:documentation></xsd:annotation></xsd:enumeration> 
      <xsd:enumeration value="M"><xsd:annotation><xsd:documentation>Elementarschaeden (alle Gefahren)</xsd:documentation></xsd:annotation></xsd:enumeration> 
      <xsd:enumeration value="B"><xsd:annotation><xsd:documentation>Beraubung</xsd:documentation></xsd:annotation></xsd:enumeration> 
      <xsd:enumeration value="M01"><xsd:annotation><xsd:documentation>Ueberschwemmung</xsd:documentation></xsd:annotation></xsd:enumeration> 
      <xsd:enumeration value="M02"><xsd:annotation><xsd:documentation>Erdbeben</xsd:documentation></xsd:annotation></xsd:enumeration> 
      <xsd:enumeration value="M03"><xsd:annotation><xsd:documentation>Schneedruck</xsd:documentation></xsd:annotation></xsd:enumeration> 
      <xsd:enumeration value="M04"><xsd:annotation><xsd:documentation>Erdrutsch</xsd:documentation></xsd:annotation></xsd:enumeration> 
      <xsd:enumeration value="M05"><xsd:annotation><xsd:documentation>Vulkanausbruch</xsd:documentation></xsd:annotation></xsd:enumeration> 
      <xsd:enumeration value="M06"><xsd:annotation><xsd:documentation>Lawine</xsd:documentation></xsd:annotation></xsd:enumeration> 
      <xsd:enumeration value="M07"><xsd:annotation><xsd:documentation>Rueckstau</xsd:documentation></xsd:annotation></xsd:enumeration> 
      <xsd:enumeration value="M08"><xsd:annotation><xsd:documentation>Erdsenkung</xsd:documentation></xsd:annotation></xsd:enumeration> 
      <xsd:enumeration value="M09"><xsd:annotation><xsd:documentation>Starkregen</xsd:documentation></xsd:annotation></xsd:enumeration> 
      <xsd:enumeration value="M99"><xsd:annotation><xsd:documentation>sonstige Elementarschaeden</xsd:documentation></xsd:annotation></xsd:enumeration> 
     </xsd:restriction> 
    </xsd:simpleContent> 
</xsd:complexType> 

Je n'ai aucune idée pourquoi le type xsi: est ignoré. Surtout parce que dans d'autres éléments, qui utilisent également des sous-classes, cela fonctionne très bien.

J'ai également remplacé le jaxb par défaut qui vient avec JDK avec le JAXBRI actuel - toujours la même erreur.

Est-ce que quelqu'un a une idée de ce qui ne va pas? Je suppose que je suis déjà « aveuglé par les lignes »: -/

Cordialement MausFan

Répondre

1

Votre question est le même que celui rapporté here. Il se manifeste encore avec Java 1.6.0_27, ce qui semble correspondre à jaxb-ri-2.2-147. Cependant, si le même code est exécuté avec Java 1.7.0_02, tout fonctionne correctement. Cela indique un problème avec la version de JAXB que vous utilisez, alors essayez de passer à un nouveau JAXB/JDK (dans mon cas, le test réussi a été exécuté sur NetBeans 7.1 avec JDK 1.7.0_02).

+0

Merci pour votre réponse. Bien que j'ai installé JDK 7u2 j'ai toujours eu la même erreur. Mais pour être certain de cela, je vais vérifier le CLASSPATH et les archives utilisées. – MausFan

+0

Pour sûr, cela doit fonctionner. J'ai été capable de le reproduire et en passant à 1.7, le faire disparaître. J'ai été capable de lire le "L" de l'exemple XML, donc le unmarshalling a réussi. –

1

Vous êtes dans une meilleure position que I. Je suis lié à Java 1.5 en raison du serveur d'application. Avec cette condition générale, il n'y a toujours pas de solution, voir http://java.net/jira/browse/JAXB-890

Questions connexes