2016-05-30 13 views
0

Ich benutze Axis 1.4 und ich möchte eine zusätzliche Ebene innerhalb der XML eines SOAP-Rumpfes innerhalb des Clients einfügen. Es gibt eine Server-Antwort, die ich mit einer Unterklasse von javax.xml.rpc.handler.GenericHandler im Client bekommen:Ändern der XML-Struktur in SOAP-Handler

Jetzt versuche ich, mit

SOAPMessageContext smc = (SOAPMessageContext) context; 
SOAPMessage message = smc.getMessage(); 
SOAPBody sb = message.getSOAPBody(); 

NodeList nl = sb.getElementsByTagName("projectDataReturn"); 
if (nl.getLength() == 0) { 
    return true; // wrong message 
} 

log.info("we have a projectDataReturn structure"); 

NodeList cl = sb.getElementsByTagName("centres"); 
if (cl.getLength() == 0) { 
    return true; // no centres 
} 

log.info("we have centres tags"); 

Auf diese die richtige Botschaft Typ zu erkennen Punkt Ich brauche ein neues Tag, das alle vorhandenen <centres> Tags enthält. Die Liste aller <centres> Tags, die ich bereits in cl gespeichert habe, aber wie kann ich dem <projectDataReturn> Tag neue Knoten hinzufügen? Und wie kann ich die vorhandenen <centre> Tags auf das neue Tag verschieben ?. Ich habe es versucht, mit

Document doc = cl.item(0).getOwnerDocument(); 

Element array = doc.createElement("centres"); 
array.setAttribute("xmlns:ns5", "http://beans.eo.xyz.de"); 
array.setAttribute("soapenc:arrayType", "ns5:CentreBean[" + cl.getLength() + "]"); 
array.setAttribute("xsi:type", "soapenc:Array"); 
array.setAttribute("xmlns:soapenc", "http://schemas.xmlsoap.org/soap/encoding/"); 

nl.item(0).appendChild(array); 

// move existing <centre> tags here 
return true; 

Aber es entsteht ein Soap

javax.xml.rpc.JAXRPCException: javax.xml.soap.SOAPException: Could not get document from SOAPEnvelope 

Was ist los?

Antwort

0

Ich habe eine Lösung gefunden:

Document doc = cl.item(0).getOwnerDocument(); 

Element array = doc.createElementNS("", "centres"); 
array.setAttributeNS("http://schemas.xmlsoap.org/soap/encoding/", "soapenc:arrayType", "CentreBean[" + cl.getLength() + "]"); 
array.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:soapenc", "http://schemas.xmlsoap.org/soap/encoding/"); 
array.setAttributeNS("http://www.w3.org/2000/xsi/", "xsi:type", "soapenc:Array"); 

Jetzt klonen ich die alten <centres> Knoten:

for (int i = 0; i < cl.getLength(); i++) { 
    array.appendChild(cl.item(i).cloneNode(true)); 
} 

Nun füge ich den neuen Knoten in die XML (vor den alten <centres> Tags) :

nl.item(0).insertBefore(array, cl.item(0)); 

Und ich entferne die alten Knoten, die auf dem falschen p sind Spitze:

for (int i = 0; i < cl.getLength(); i++) { 
    nl.item(0).removeChild(cl.item(i)); 
} 

Wenn Sie den Handler-Code in der Handler Kette Ihres Service-Stub auf Client-Seite registrieren, wird es kurz vor der XML-Deserialisierung der Serverantwort ausgeführt werden:

import javax.xml.namespace.QName; 
import javax.xml.rpc.handler.HandlerInfo; 
import javax.xml.rpc.handler.HandlerRegistry; 

// uses Axis1 generated client classes 
MyService_Service serviceLocator = new MyService_ServiceLocator(); 

HandlerRegistry hr = serviceLocator.getHandlerRegistry(); 
List<HandlerInfo> handlerChain = hr.getHandlerChain((QName) serviceLocator.getPorts().next()); 

HandlerInfo hi = new HandlerInfo(); 
hi.setHandlerClass(MyXMLInjectionHandler.class); 
handlerChain.add(hi);