JAXWS Soap Handler Large MTOM Attachments

后端 未结 2 1444
北荒
北荒 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:18

    Here is how to access the headers without reading the entire message using the WebSphere built-in JAX-WS implementation.

    public boolean handleMessage(SOAPMessageContext context) {
    
        AttributedURI messageIdURI = (AttributedURI)context.get("com.ibm.wsspi.wsaddressing.inbound.MessageID");
        String messageId = "";
        if (messageIdURI != null && messageIdURI.getURI() != null) {
            messageId = messageIdURI.getURI().toString();
        }
        EndpointReference fromApplicationEPR = (EndpointReference)context.get("com.ibm.wsspi.wsaddressing.inbound.FromEPR");
        String fromApplication = "";
        if (fromApplicationEPR != null && fromApplicationEPR.getAddress() != null &&
            fromApplicationEPR.getAddress().getURI() != null) {
            fromApplication = fromApplicationEPR.getAddress().getURI().toString();
        }
    
        ...
    
        return true;
    }
    

    Note that this differs based on the precise JAX-WS implementation. I'll post how to do this via Apache CXF when I get a chance. Here are the needed imports for the above code:

    import com.ibm.ws.wsaddressing.AttributedURI;
    import com.ibm.ws.wsaddressing.EndpointReference;
    
    0 讨论(0)
  • 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")
    
    0 讨论(0)
提交回复
热议问题