2016-05-30 34 views
0

我使用Axis 1.4,並且我想在客戶端中的SOAP主體的XML中插入額外的級別。有一個服務器響應,我可以用javax.xml.rpc.handler.GenericHandler的客戶端中的子類得到:更改SOAP處理程序中的XML結構

現在,我嘗試用

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"); 

在此認識到正確的信息類型點我需要一個新的標籤,其中包含所有現有的<centres>標籤。已存儲在cl中的所有<centres>標記的列表已經存在,但我如何將新節點添加到<projectDataReturn>標記?以及如何將現有<centre>標籤移動到新標籤?我曾與

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; 

嘗試過,但它產生的SoapException

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

有什麼不對?

回答

0

我已經找到了解決辦法:

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"); 

現在我克隆老<centres>節點:

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

現在我將新節點插入到XML(舊<centres>標籤前) :

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

然後我刪除舊節點,這是錯誤的p花邊:

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

如果您註冊在客戶端的服務存根的處理程序鏈中的處理程序代碼,它只會被服務器響應的XML序列化之前執行:

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);