2013-10-09 4 views
1

이전에는 XML 파일을 읽고 응답으로 반환하는 축을 사용하여 웹 서비스에 대한 하나의 처리기를 구현했습니다. 내 코드는 아래와 같습니다.축 2 응답 바꾸기

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를 사용하여 동일한 작업을 수행해야합니다. 누구든지 축 2에서 나가는 응답을 대체하는 방법을 알고 있습니까? 파일을 문자열로 변환하려고 시도했는데 envelope.setText()를 호출했지만 실패하고 "org.apache.axiom.soap.SOAPProcessingException: Can not detach SOAP Body, SOAP Envelope must have a Body !!"예외가 발생합니다.

도움말/조언에 미리 감사드립니다. 축 2의

내 코드 :

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

감사를 설정합니다. 그러나 나는 비누 반응을 완전히 대체하고 축에서 할 수 있습니다. 축 2에서 어떻게하는지 알고 있습니까? – bear

+0

envelope.setText ("abc")를 호출했지만 실패하고 "org.apache.axiom.soap.SOAPProcessingException : SOAP Body를 분리 할 수 ​​없습니다. SOAP Envelope에 Body가 있어야합니다 !!"라는 예외가 발생합니다. – bear

+0

Axis2 코드보기. – shazin