2010-07-06 77 views
26

Recibo un error cuando intento para generar un elemento que debe ser similarorg.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: Un nodo se utiliza en un documento diferente a la que lo creó

<hold/> 

Usando el código de cliente java generado por Axis2. fragmento Java

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

pero cuando un incendio si fuera poco me da un error de WRONG_DOCUMENT_ERR. Si no incluyo este elemento en el mensaje que se activa, funciona bien. Alguien tiene alguna idea de cómo solucionarlo?

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 

Respuesta

2

No se puede copiar un nodo de un documento y pegarlo en otro. Un intento de hacerlo da como resultado este tipo de error.

El nodo debe importarse correctamente. Si recuerdo bien, la clase Document ofrece los métodos correctos para esta tarea común.

EDITAR

El problema podría estar en el código detrás del método setHold. El elemento tiene que ser importado. Si todo esto es código autogenerado, entonces buscar una versión más nueva del eje podría resolver el problema. Ver mi comentario, donde mencioné un problema de eje 1.3/1.4.

+0

Lo siento, no estoy seguro de lo que quiere decir, no puedo ver dónde copio y pegué un nodo de un documento a otro. Estoy usando el código de cliente generado desde Axis2 wsdl2java. ¿Se generó un método para agregar el elemento pero provoca un error cuando lo agrego? – yurl

+0

¿Cuál es su versión del eje? Hay al menos un problema informado aquí: https://issues.apache.org/jira/browse/AXIS-2705 –

+0

Estoy usando 1.4. Veré si usar 1.5 lo arreglará. – yurl

67

Utilizo esta implementación para agregar Nodo de un documento XML a otro.

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

Ver si esto ayuda. El truco es simplemente importar un nodo a otro documento, en lugar de anexarlo directamente.

+0

Si firstDoc es el documento donde está tomando el nodo y el segundo doc es donde lo va a usar, entonces debe usar: secondDoc.importNode (firstDocsNode, true) aunque la palabra 'import' lo implica. –

+0

Funciona como un amuleto –

+0

¿Alguna idea de lo que significa el booleano (en este caso, "verdadero")? – dokaspar

0

Vimos este error cuando enviamos un mensaje 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] 

Error en SAAJOutinterceptor que se ha procesado antes de SoapOutInterceptor. La implementación de Saaj fue de JBoss. Y crea un documento con otro cargador de clases. Este documento de Saaj rompe SoapOutInterceptor.

Resolvimos este problema añadiendo dependencia a nuestro módulo.

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