2010-07-06 30 views
26

Ricevo un errore quando provo a generare un elemento che dovrebbe essere simileorg.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: Un nodo viene utilizzato in un documento diverso da quello che lo ha creato

<hold/> 

Utilizzo del codice client java generato da Axis2. java snippet

HoldPayment hold = new HoldPayment() 
cr.setHold(hold); 

ma quando sparo fuori ottengo un errore di WRONG_DOCUMENT_ERR. Se non includo questo elemento nel messaggio che viene sparato, funziona bene. qualcuno ha idea di come ripararlo?

AxisFault 
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException 
faultSubcode: 
faultString: org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: A node is used in a different document than the one that created it. 
faultActor: 
faultNode: 
faultDetail: 
     {http://xml.apache.org/axis/}stackTrace:org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: A node is used in a different document than the one that created it. 
     at com.sun.org.apache.xerces.internal.dom.ParentNode.internalInsertBefore(ParentNode.java:352) 
     at com.sun.org.apache.xerces.internal.dom.ParentNode.insertBefore(ParentNode.java:284) 
     at com.sun.org.apache.xerces.internal.dom.NodeImpl.appendChild(NodeImpl.java:235) 
     at org.apache.axis.message.SOAPFaultBuilder.onEndChild(SOAPFaultBuilder.java:305) 
     at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1090) 
     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:1774) 
     at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2930) 
     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:510) 
     at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807) 
     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:107) 
     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 javax.xml.parsers.SAXParser.parse(SAXParser.java:395) 
     at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227) 
     at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696) 
     at org.apache.axis.Message.getSOAPEnvelope(Message.java:435) 
     at org.apache.axis.transport.http.HTTPSender.readFromSocket(HTTPSender.java:796) 
     at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:144) 
     at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32) 
     at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118) 
     at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83) 
     at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165) 
     at org.apache.axis.client.Call.invokeEngine(Call.java:2784) 
     at org.apache.axis.client.Call.invoke(Call.java:2767) 
     at org.apache.axis.client.Call.invoke(Call.java:2443) 
     at org.apache.axis.client.Call.invoke(Call.java:2366) 
     at org.apache.axis.client.Call.invoke(Call.java:1812) 
     at au.com.virginblue.www.schema._2005._02.booking_wsdl.BookingBindingStub.createReservation(BookingBindingStub.java:1803) 
     at com.test.GetDJBooking.main(GetDJBooking.java:215) 

     {http://xml.apache.org/axis/}hostname:test.com.au 

org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: A node is used in a different document than the one that created it. 
     at org.apache.axis.AxisFault.makeFault(AxisFault.java:101) 
     at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:701) 
     at org.apache.axis.Message.getSOAPEnvelope(Message.java:435) 
     at org.apache.axis.transport.http.HTTPSender.readFromSocket(HTTPSender.java:796) 
     at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:144) 
     at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32) 
     at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118) 
     at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83) 
     at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165) 
     at org.apache.axis.client.Call.invokeEngine(Call.java:2784) 
     at org.apache.axis.client.Call.invoke(Call.java:2767) 
     at org.apache.axis.client.Call.invoke(Call.java:2443) 
     at org.apache.axis.client.Call.invoke(Call.java:2366) 
     at org.apache.axis.client.Call.invoke(Call.java:1812) 
     at au.com.virginblue.www.schema._2005._02.booking_wsdl.BookingBindingStub.createReservation(BookingBindingStub.java:1803) 
     at com.nhh.dj.GetDJBooking.main(GetDJBooking.java:215) 
Caused by: org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: A node is used in a different document than the one that created it. 
     at com.sun.org.apache.xerces.internal.dom.ParentNode.internalInsertBefore(ParentNode.java:352) 
     at com.sun.org.apache.xerces.internal.dom.ParentNode.insertBefore(ParentNode.java:284) 
     at com.sun.org.apache.xerces.internal.dom.NodeImpl.appendChild(NodeImpl.java:235) 
     at org.apache.axis.message.SOAPFaultBuilder.onEndChild(SOAPFaultBuilder.java:305) 
     at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1090) 
     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:1774) 
     at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2930) 
     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:510) 
     at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807) 
     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:107) 
     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 javax.xml.parsers.SAXParser.parse(SAXParser.java:395) 
     at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227) 
     at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696) 
     ... 14 more 

risposta

2

Non è possibile copiare un nodo da un documento e incollarlo in un altro. Un tentativo di farlo risulta in questo tipo di errore.

Il nodo deve essere correttamente importate. Se ricordo bene, la classe Document offre i giusti metodi per questa attività comune.

EDIT

Il problema potrebbe essere nel codice dietro il metodo setHold. L'elemento deve essere importato. Se questo è tutto il codice generato automaticamente, cercare una versione più recente dell'asse potrebbe risolvere il problema. Vedi il mio commento, dove ho menzionato un problema dell'asse 1.3/1.4.

+0

Mi dispiace non sono sicuro di quello che vuoi dire, non riesco a vedere dove copio e incollato un nodo da un documento all'altro. Sto usando il codice client generato da Axis2 wsdl2java. Ha generato un metodo per aggiungere l'elemento ma provoca un errore quando lo aggiungo? – yurl

+0

Qual è la tua versione dell'asse? C'è almeno un problema segnalato qui: https://issues.apache.org/jira/browse/AXIS-2705 –

+0

Sto usando 1.4. Vedrò se usare 1.5 lo risolverà. – yurl

67

Io uso questa implementazione per aggiungere Nodo da un documento XML ad altri.

Node firstDocImportedNode = firstDoc.importNode(secondDocsNode, true); 
firstDocNode.appendChild(firstDocImportedNode); 

Vedere se questo aiuta. Trick sta semplicemente importando un nodo su un altro documento, invece di aggiungerlo direttamente.

+0

Se firstDoc è il documento da cui si prende il nodo e il secondoDoc è dove lo si utilizzerà, è necessario utilizzare: secondDoc.importNode (firstDocsNode, true) sebbene la parola "import" implichi ciò. –

+0

funziona come un fascino –

+0

Qualsiasi idea di ciò che il booleano (in questo caso 'true') sta per? – dokaspar

0

Abbiamo visto questo errore quando inviare il messaggio SOAP con CXF.

org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: A node is used in a different document than the one that created it. 
at org.apache.xerces.dom.ParentNode.internalInsertBefore(ParentNode.java:351) 
at org.apache.xerces.dom.ParentNode.insertBefore(ParentNode.java:283) 
at org.apache.xerces.dom.CoreDocumentImpl.insertBefore(CoreDocumentImpl.java:393) 
at org.apache.xerces.dom.NodeImpl.appendChild(NodeImpl.java:236) 
at org.jboss.ws.core.soap.SOAPDocument.appendChild(SOAPDocument.java:226) 
at org.jboss.ws.core.soap.SOAPPartImpl.appendChild(SOAPPartImpl.java:300) 
at org.apache.cxf.staxutils.W3CDOMStreamWriter.setChild(W3CDOMStreamWriter.java:119) [cxf-common-utilities-2.5.4.jar:2.5.4] 
at org.apache.cxf.staxutils.W3CDOMStreamWriter.newChild(W3CDOMStreamWriter.java:109) [cxf-common-utilities-2.5.4.jar:2.5.4] 
at org.apache.cxf.staxutils.W3CDOMStreamWriter.writeStartElement(W3CDOMStreamWriter.java:137) [cxf-common-utilities-2.5.4.jar:2.5.4] 
at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.writeSoapEnvelopeStart(SoapOutInterceptor.java:122) [cxf-rt-bindings-soap-2.4.6.jar:2.4.6] 

Errore in SAAJOutInterceptor elaborato prima di SoapOutInterceptor. L'implementazione di Saaj era di JBoss. E crea un documento con un altro classloader. Questo documento di Saaj rompe SoapOutInterceptor.

abbiamo risolto questo problema aggiungendo la dipendenza al nostro modulo.

<dependency> 
    <groupId>com.sun.xml.messaging.saaj</groupId> 
    <artifactId>saaj-impl</artifactId> 
    <version>1.3</version> 
</dependency> 
Problemi correlati