【问题标题】:How to get SOAP headers如何获取 SOAP 标头
【发布时间】:2012-04-23 16:30:32
【问题描述】:

这是请求

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:soap="http://soap.ws.server.wst.fit.cvut.cz/">
    <soapenv:Header>
        <userId>someId</userId>
    </soapenv:Header>
    <soapenv:Body>
    ...
    </soapenv:Body>
</soapenv:Envelope>

我想得到那个userId

我试过了

private List<Header> getHeaders() {
    MessageContext messageContext = context.getMessageContext();
    if (messageContext == null || !(messageContext instanceof WrappedMessageContext)) {
        return null;
    }
    Message message = ((WrappedMessageContext) messageContext).getWrappedMessage();
    return CastUtils.cast((List<?>) message.get(Header.HEADER_LIST));
}

private String getHeader(String name) {
    List<Header> headers = getHeaders();
    if (headers != null) {
        for (Header header : headers) {
            logger.debug(header.getObject());
            // return header by the given name                   
        }
    }
    return null;
}

它记录[userId : null]。我怎样才能获得价值,为什么null 在那里?

【问题讨论】:

    标签: java soap jax-ws cxf


    【解决方案1】:

    "[userId : null]" 通常是 DOM 元素的“toString”打印输出。如果你做类似的事情很可能

    logger.debug(header.getObject().getClass())
    

    你会看到它是某种 DOM Element 的子类。因此,类似于:

    logger.debug(((Element)header.getObject()).getTextContent())
    

    可能会打印文本节点。

    【讨论】:

      【解决方案2】:
          import javax.xml.soap.*;
      
          SOAPPart part = request.getSOAPPart();
          SOAPEnvelope env = part.getEnvelope();
          SOAPHeader header = env.getHeader();
          if (header == null) {
              // Throw an exception
           }
      
          NodeList userIdNode = header.getElementsByTagNameNS("*", "userId");
          String userId = userIdNode.item(0).getChildNodes().item(0).getNodeValue();
      

      【讨论】:

      • 不知道这个代码 sn-p 的效率和可靠性如何,但对我来说效果很好;)
      • 我发现这个答案很有帮助,因为它(正确地)显示了如何从 SOAP 标头中提取内容。
      • SOAPPart part = request.getSOAPPart(); 这部分给我错误,因为它无法识别请求。
      • 这里如何获取请求?
      【解决方案3】:

      你可以在没有拦截器和没有 JAXB 的情况下获得肥皂头。

      在你的 service_impl 类中添加:

      public class YourFunctionNameImpl implements YourFunctionName{
      
      @Resource
      private WebServiceContext context;
      
      private List<Header> getHeaders() {
          MessageContext messageContext = context.getMessageContext();
          if (messageContext == null || !(messageContext instanceof WrappedMessageContext)) {
              return null;
          }
      
          Message message = ((WrappedMessageContext) messageContext).getWrappedMessage();
          List<Header> headers = CastUtils.cast((List<?>) message.get(Header.HEADER_LIST));
          return headers;
      }
      

      ...

      然后在你的函数中你可以使用:

      List<Header> headers = getHeaders();
              for(Iterator<Header> i = headers.iterator(); i.hasNext();) { 
                  Header h = i.next(); 
                  Element n = (Element)h.getObject(); 
      
                  System.out.println("header name="+n.getLocalName()); 
                  System.out.println("header content="+n.getTextContent()); 
          }
      

      【讨论】:

      【解决方案4】:

      有一个MessageContextmessageContext,你可以使用这个代码:

      HeaderList hl = (HeaderList) messageContext.get(JAXWSProperties.INBOUND_HEADER_LIST_PROPERTY);
      

      这使您可以访问所有 SOAP 标头。

      【讨论】:

      • 在我看来,HeaderListJAXWSPropertiescom.sun.xml.internal.ws.* 包中的类。我真的不想用这个……
      【解决方案5】:

      我们可以通过在CXF拦截器中添加以下代码来获取服务器端的SOAP头。

      创建一个类似的类

      公共类 ServerCustomHeaderInterceptor 扩展 AbstractSoapInterceptor {

      @Resource
      private WebServiceContext context;
      
      public ServerCustomHeaderInterceptor() {
          super(Phase.INVOKE);
      
      }
      
      @Override
      public void handleMessage(SoapMessage message) throws Fault,JAXBException {
          System.out.println("ServerCustomHeaderInterceptor  handleMessage");
          JAXBContext jc=null;
          Unmarshaller unmarshaller=null;
          try {
          jc = JAXBContext.newInstance("org.example.hello_ws");
          unmarshaller = jc.createUnmarshaller();
          } catch (JAXBException e) {
          e.printStackTrace();
          }
      
      
          List<Header> list = message.getHeaders();
          for (Header header : list) {
                  ElementNSImpl el = (ElementNSImpl) header.getObject();
              ParentNode pn= (ParentNode) el.getFirstChild();
              //Node n1= (Node) pn;
              //Node n1= (Node) el.getFirstChild();
      
              CustomHeader customHeader=(CustomHeader)  unmarshaller.unmarshal(el.getFirstChild());
      
      
          }
      
      }
      

      在此之后,我们需要将其作为拦截器注入

       <jaxws:inInterceptors>
              <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
          <bean class="org.example.hellows.soap12.ServerCustomHeaderInterceptor" />
         </jaxws:inInterceptors>
      

      在您的服务器上下文 xml 中。

      我们可能需要根据您的要求更改几行。基本流程将像这样工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-18
        • 1970-01-01
        相关资源
        最近更新 更多