2017-05-25 2 views
0

J'utilise WebServices et Apache Camel et utilise dataFormat comme POJO pour demander ce service Web. Je réussis à appeler le service, mais je veux enregistrer le message SOAP de demande et de réponse que je ne suis pas capable de faire parce que le message SOAP est créé par CXF à partir de la classe POJO.Obtention d'un message SOAP de requête et de réponse lorsque dataFormat est POJO

Y a-t-il un moyen pour que je puisse enregistrer le message SOAP de requête et de réponse lorsque dataFormat est POJO?

+0

Regardez CXF intercepteurs pour enregistrer les messages . – Namphibian

Répondre

0

c'est l'exemple que je suis l'enregistrement des demandes de savon et la réponse dans mon projet, espérons que cette aide

BindingProvider bindingProvider = ((BindingProvider) PortType); 
List<Handler> handlerChain = bindingProvider.getBinding().getHandlerChain(); 
handlerChain.add(new SOAPLoggingHandler());  
bindingProvider.getBinding().setHandlerChain(handlerChain); 

et la classe SOAPLoggingHandler

public class SOAPLoggingHandler implements SOAPHandler<SOAPMessageContext> { 

    // change this to redirect output if desired 
    public static Logger logger = Logger.getLogger("GetCustomerDataLand"); 

    public Set<QName> getHeaders() { 
     return null; 
    } 

    public boolean handleMessage(SOAPMessageContext smc) { 
     logToSystemOut(smc); 
     return true; 
    } 

    public boolean handleFault(SOAPMessageContext smc) { 
     logToSystemOut(smc); 
     return true; 
    } 

    // nothing to clean up 
    public void close(MessageContext messageContext) { 
    } 

    /* 
    * Check the MESSAGE_OUTBOUND_PROPERTY in the context to see if this is an 
    * outgoing or incoming message. Write a brief message to the print stream 
    * and output the message. The writeTo() method can throw SOAPException or 
    * IOException 
    */ 
    private void logToSystemOut(SOAPMessageContext smc) { 
     Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 

     if (outboundProperty.booleanValue()) { 
      logger.info(new SimpleDateFormat("yyyy-MM-dd HH:mm:sss").format(new Date()) + "\nOutbound message:"); 
     } else { 
      logger.info(new SimpleDateFormat("yyyy-MM-dd HH:mm:sss").format(new Date()) + "\nInbound message:"); 
     } 

     SOAPMessage message = smc.getMessage(); 
     try { 

      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      message.writeTo(stream); 
      String msg = new String(stream.toByteArray(), "utf-8"); 

      logger.info(toPrettyString(msg)); 
      // message.writeTo(out); 
      logger.info(""); // just to add a newline 
     } catch (Exception e) { 
      logger.info(new SimpleDateFormat("yyyy-MM-dd HH:mm:sss").format(new Date()) + "Exception in handler: " 
        + org.apache.commons.lang.exception.ExceptionUtils.getStackTrace(e)); 
     } 
    } 

    public String toPrettyString(String xml) { 

     try { 
      final InputSource src = new InputSource(new StringReader(xml)); 
      final Node document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(src) 
        .getDocumentElement(); 
      final Boolean keepDeclaration = Boolean.valueOf(xml.startsWith("<?xml")); 
      final DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance(); 
      final DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("LS"); 
      final LSSerializer writer = impl.createLSSerializer(); 

      writer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE); 
      writer.getDomConfig().setParameter("xml-declaration", keepDeclaration); 
      return writer.writeToString(document); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 
}