2013-10-09 72 views
1

以前我沒有爲使用座標軸的web服務實現一個處理程序,該座標將讀取xml文件並將其作爲響應返回。我的代碼如下:替換axis2響應

try { 
     Message msg = msgContext.getResponseMessage(); 
     MessageContext context = MessageContext.getCurrentContext(); 



     InputStream in = this.getClass().getClassLoader().getResourceAsStream("login_rsp_xml"); 
     if(in==null){ 

      System.out.println("in is empty!!!"); 
     } 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory 
       .newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(in); 
     msg.getSOAPPart().setContent(new DOMSource(doc)); 
     System.out.println("return file>>"+fileName); 

    } catch (Exception e) { 
     System.setProperty("req_no", null); 
     e.printStackTrace();    
    } 

現在,我需要使用axis2做同樣的事情。有誰知道如何替換axis2中的傳出響應?我確實嘗試將文件轉換爲字符串並調用envelope.setText(),但失敗並得到異常「org.apache.axiom.soap.SOAPProcessingException: Can not detach SOAP Body, SOAP Envelope must have a Body !!」。

在此先感謝您的幫助/建議。

我在Axis2的代碼:

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpSession; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

import org.apache.axiom.om.OMAbstractFactory; 
import org.apache.axiom.om.OMElement; 
import org.apache.axiom.om.OMFactory; 
import org.apache.axiom.om.impl.builder.StAXOMBuilder; 
import org.apache.axiom.om.util.AXIOMUtil; 
import org.apache.axiom.soap.SOAPEnvelope; 
import org.apache.axiom.soap.SOAPFactory; 
import org.apache.axis2.AxisFault; 
import org.apache.axis2.context.MessageContext; 
import org.apache.axis2.context.ServiceContext; 
import org.apache.axis2.description.AxisMessage; 
import org.apache.axis2.description.AxisService; 
import org.apache.axis2.engine.Handler; 
import org.apache.axis2.handlers.AbstractHandler; 
import org.apache.axis2.jaxws.message.Message; 
import org.apache.axis2.transport.http.HTTPConstants; 
import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

public class SamRspHandler extends AbstractHandler implements Handler { 


    public String getFileContent(String path) throws Exception{ 
     InputStream in = this.getClass().getClassLoader() 
       //.getResourceAsStream("/xmlFiles/loginRspHeader.xml"); 
       .getResourceAsStream(path); 

     DocumentBuilderFactory dbFactory = DocumentBuilderFactory 
       .newInstance(); 

     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc2 = dBuilder.parse(in); 
     TransformerFactory tf = TransformerFactory.newInstance(); 
     Transformer transformer = tf.newTransformer(); 
     transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, 
       "yes"); 
     StringWriter writer = new StringWriter(); 
     transformer 
       .transform(new DOMSource(doc2), new StreamResult(writer)); 
     String output2 = writer.getBuffer().toString(); 

     return output2; 
    } 

    public InvocationResponse invoke(MessageContext msgContext) 
      throws AxisFault { 
     System.out.println("In Response"); 


     String content = msgContext.getEnvelope().toString(); 

     try { 

      System.out.println("zzzz>>"+System.getProperty("abc"));   


      msgContext.getEnvelope().setText("abc"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return InvocationResponse.CONTINUE; 
    } 

    public void revoke(MessageContext msgContext) { 

    } 


} 

回答

0

如果要設置一個SOAP響應中的XML文件,則必須將其 <![CDATA[]>標籤的內部封閉。這是爲了防止將該XML文件作爲SOAP響應的一部分進行處理。請注意,SOAP還使用XML來處理請求和響應。

<![CDATA[ 
    <?xml version="1.0"?> 
    <!-- Your XML --> 
]> 

創建XML文件上面,並將其設置envelope.setText()

+0

感謝您的答覆。但是,我想完全取代肥皂響應,並且我能夠在軸上執行此操作。你知道如何在axis2中做到這一點嗎? – bear

+0

我確實調用了envelope.setText(「abc」),但失敗並得到異常「org.apache.axiom.soap.SOAPProcessingException:無法分離SOAP Body,SOAP Envelope必須有Body !!」。 – bear

+0

讓我看看你的Axis2代碼。 – shazin