2012-12-18 36 views
3

我試圖找到一種將標題元素添加到SOAP消息的方法。 如果我使用@WebParamheader設置爲true那麼它工作正常,該參數在<soap:header>很好。但是,這需要在我的API中添加一堆參數,這幾乎不是一種選擇。將標題元素添加到SOAP消息

在第一視圖攔截器似乎不可能,所以我在看SOAPHandlers,但很難找到關於這個的明確信息。

這是我的Spring配置:

<bean id="testWebservice" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean" > 
    <property name="serviceInterface" value="com...TestWebService"/> 
    <property name="wsdlDocumentUrl" value="http://localhost:9062/test-ws/remoting/test?wsdl"/> 
    <property name="serviceName" value="TestWebService"/> 
    <property name="namespaceUri" value="http://test.com"/> 
    <property name="portName" value="TestServicePort"/> 
    <property name="lookupServiceOnStartup" value="false"/> 
    <property name="handlerResolver" ref="myResolver"/> 
</bean> 

<bean id="myResolver" class="com...TestHandlerResolver" /> 

我的處理程序(在TestHandlerResolver鏈接):

public class TestHandler implements SOAPHandler<SOAPMessageContext> { 

    @Override 
    public void close(MessageContext context) { 
    } 

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

    @Override 
    public boolean handleFault(SOAPMessageContext context) { 
     return true; 
    } 

    @Override 
    public boolean handleMessage(SOAPMessageContext context) { 
     if (Boolean.TRUE.equals(context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY))) { 

      try { 
       List<Header> headers = new ArrayList<Header>(); 
       Header dummyHeader; 
       dummyHeader = new Header(new QName("dummy"), "decapitated", new JAXBDataBinding(String.class)); 
       headers.add(dummyHeader); 
       context.put(Header.HEADER_LIST, headers); 
      } catch (Exception e) { 
       throw new RuntimeException(e); 
      } 
     } 
     return true; 
    } 
} 

的問題是,我有點不知所措。正在使用處理程序正確的方式來做到這一點,如果是的話,你可以給我或一個很好的例子指向我?攔截器有沒有辦法做到這一點?還是我在這裏完全的目標...

+0

好一點,我忘了提,這是行不通的。該代碼無例外地執行,但虛擬標題未添加到消息中。 –

回答

2

得到它的工作是這樣的:

 @Override 
    public boolean handleMessage(SOAPMessageContext context) { 

      try { 
       SOAPMessage msg = context.getMessage(); 
       SOAPPart part = msg.getSOAPPart(); 
       SOAPEnvelope envelope = part.getEnvelope(); 

       SOAPHeader header = envelope.getHeader(); 

       if (Boolean.TRUE.equals(context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY))) { 
        if (header == null) { 
         header = envelope.addHeader(); 
        } 
        this.addToHeader(envelope, header, "MessageID", UUID.randomUUID().toString()); 
    ... 
       } else { 
        if (header != null) { 
         Iterator<?> i = header.getChildElements(); 
         while (i.hasNext()) { 
          SOAPElement el = (SOAPElement) i.next(); 
          String tagName = el.getLocalName(); 
          String value = el.getValue(); 
    ... 
         } 
        } 

       } 
      } catch (Exception e) { 
... 

      } 
      return true; 
     } 

     private void addToHeader(SOAPEnvelope envelope, SOAPHeader header, String key, String value) throws SOAPException { 
      Name qname = envelope.createName(key, "ns1", "http://ecom.bnpp.com"); 
      SOAPHeaderElement element = header.addHeaderElement(qname); 
      element.addTextNode(value); 
     }