2013-08-28 23 views
5

Possiedo un oggetto JAXB che può essere unmarshal valido. Tuttavia, se si aggiunge un [] campo Elemento annotato con @XmlAnyElement, quando si tenta di unmarshalling getta:API JAXP non valida quando non si rimuove il JAXB

java.lang.IllegalStateException: Si esegue con invalida API JAXP o implementazione. È richiesto JAXP api/implementazione della versione 1.3.1 (inclusa in JDK6) o superiore. Nel caso si utilizzi formica, assicurarsi che sia usato ant 1.7.0 o versioni successive - le versioni precedenti di formiche contengono JAXP api/impl versione 1.2 (in xml-apis.jar). Se si desidera continuare a utilizzare versioni precedenti di formiche, è necessario configurarlo per utilizzare le versioni api/impl di JAXP più elevate.

Si esegue da un test TestG che sto eseguendo tramite il plugin Eclipse. Sono in esecuzione con il JDK 1.6 e configurato maven per escludere le vecchie versioni del jar xml-apis, ma non riesco a farlo funzionare. Presumo che sto ancora raccogliendo versioni incompatibili delle librerie da qualche parte ma non so da dove provenga.

Esecuzione via Eclipse direttamente ottengo:

29-Aug-2013 10:04:08 com.sun.xml.bind.v2.util.XmlFactory createTransformerFactory 
SEVERE: null 
java.lang.AbstractMethodError: javax.xml.transform.TransformerFactory.setFeature(Ljava/lang/String;Z)V 
    at com.sun.xml.bind.v2.util.XmlFactory.createTransformerFactory(XmlFactory.java:155) 
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.createTransformerHandler(JAXBContextImpl.java:747) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.DomLoader$State.<init>(DomLoader.java:75) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.DomLoader.startElement(DomLoader.java:118) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.ProxyLoader.startElement(ProxyLoader.java:60) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:501) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:480) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:150) 
    at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source) 
    at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source) 
    at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source) 
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) 
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
    at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source) 
    at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source) 
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) 
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:218) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:190) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:184) 
    at com.gtspt.vrs.parser.AbstractParserTest.unmarshal(AbstractParserTest.java:33) 
    at com.gtspt.vrs.parser.AbstractParserTest.testParser(AbstractParserTest.java:26) 
    at com.gtspt.vrs.parser.TestResultsParser.testParser(TestResultsParser.java:17) 
    at com.gtspt.vrs.parser.Test.main(Test.java:16) 
+0

Se si esegue all'esterno di un ambiente TestNG, tutto funziona correttamente? –

+0

Aggiunta traccia dello stack in modifica. – samblake

risposta

12

Sembra che il problema è dovuto ad una vecchia versione di Xalan. Sembra che sia necessario un minimo della versione 2.7.0 da quando JDK 5. Un'altra libreria stava introducendo una versione precedente, quindi ho escluso quella dalla build di Maven e ora tutto sembra a posto.

1

In aggiunta/supporto e per essere più specifici, se si sta eseguendo un progetto Maven o JPA si dovrebbe essere in grado di fare clic destro sulla directory delle dipendenze, aggiungere dipendenza e cercare xalan. Aggiungi qualsiasi versione 2.7.0 e successiva alla lista xalan: xalan.

4

Nel mio caso è stato causato dalla versione precedente di xercesImpl. Dipendenza sotto risolto

<dependency> 
     <groupId>xerces</groupId> 
     <artifactId>xercesImpl</artifactId> 
     <version>2.11.0</version> 
</dependency> 
+0

Grazie, è stato frustrante. L'aggiornamento della mia dipendenza da xerces ha corretto il mio problema! –

0

ho incontrato lo stesso errore con le stesse formulazioni, ma si è rivelato essere un problema completamente diverso da quello problema di dipendenza come l'errore suggerito. Quindi sto condividendo il mio incontro qui nel caso in cui qualcuno là fuori possa anche trarne beneficio.

avevo qualcosa come questi nel mio codice:

public class ImageObject { 

    @XmlElementWrapper(name="shapes") 
    @XmlAnyElement(lax=true) 
    @XmlElementRefs({ 
    @XmlElementRef(name = "circle", type=Circle.class), 
    @XmlElementRef(name = "square", type=Square.class), 
    @XmlElementRef(name = "rectangle", type=Rectangle.class), 
    @XmlElementRef(name = "triangle", type=Triangle.class) 
    }) 
    private List<Object> shapes; 

    ... 
} 

E nella classe Rectangle, ho avuto un errore di battitura nel nome di un elemento specificato per il @XmlRootElement - "retangle", che non corrisponde al nome "rettangolo" all'interno del @XmlElementRef nella classe ImageObject:

@XmlRootElement(name = "retangle") 
public class Rectangle extends Shape { 

    @XmlAttribute 
    private String colour; 

    @XmlAttribute 
    private String width; 

    ... 
} 

Quindi, guardare fuori per questo anche se si utilizza l'annotazione @XmlElementRef.