JAXWS Soap Handler Large MTOM Attachments

后端 未结 2 1448
北荒
北荒 2020-12-22 01:10

The JAXWS implementation within IBM WebSphere 7 and 8 appears to have some problems when it comes to soap handlers and large MTOM attachments. It appears that the entire mes

2条回答
  •  庸人自扰
    2020-12-22 01:34

    For Apache CXF, the best approach is to use an Interceptor which is CXF implementation specific. Below is an example custom interceptor class.

    package com.company.app.interceptor;
    
    import javax.xml.namespace.QName;
    
    import org.apache.cxf.binding.soap.SoapMessage;
    import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
    import org.apache.cxf.headers.Header;
    import org.apache.cxf.interceptor.Fault;
    import org.apache.cxf.phase.Phase;
    import org.apache.log4j.Logger;
    import org.w3c.dom.Element;
    
    public class SOAPHeaderInterceptor extends AbstractSoapInterceptor  {
        private static Logger logger = Logger.getLogger(SOAPHeaderInterceptor.class);
    
        public SOAPHeaderInterceptor() {
            super(Phase.USER_PROTOCOL);
        }
    
        @Override
        public void handleMessage(SoapMessage message) throws Fault {
            try {
                Header fromHeader = message.getHeader(new QName("http://www.w3.org/2005/08/addressing", "From"));
                Header messageIdHeader = message.getHeader(new QName("http://www.w3.org/2005/08/addressing", "MessageID"));
    
                String from = null;
                if (fromHeader != null && fromHeader.getObject() != null) {
                    from = ((Element)fromHeader.getObject()).getTextContent();
                }
                String messageId = null; 
                if (messageIdHeader != null && messageIdHeader.getObject() != null) {
                    messageId = ((Element)messageIdHeader.getObject()).getTextContent();
                }
            } catch (Exception e) {
                logger.error("Unable to read SOAP Headers", e);
            } 
        }
    }
    

    Then, in your JAX-WS service implementation class specify the @InInterceptors annotation.

    @InInterceptors(interceptors ="com.company.app.interceptor.SOAPHeaderInterceptor")
    

提交回复
热议问题