2013-10-09 3 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();    
    } 

Теперь, мне нужно сделать то же самое, используя ось 2. Кто-нибудь знал, как заменить исходящий ответ на ось 2? Я попытался преобразовать файл в строку и вызвать 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

Если вы устанавливаете файл XML внутри SOAP-ответ, он должен быть заключен внутри <![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 должен иметь тело !!». – bear

+0

Покажите мне свой код Axis2. – shazin

Смежные вопросы