AXIS2 Webservice Client 移除 XML Header 中 mustUnderstand:mustUnderstand…..

最近合作廠商提供了一個新版本的Webservice,在 Java 世界中有個好用的工具叫 WSDL2JAVA,舉凡有:Apache Axis2 , Apache CXF …等工具都有支持,這次我選用了 Apache Axis2。
這次版本主要是SOAP 2.0 升級到 SOAP 4.0,並調整原先Session 機制及相關的安全機制,一開始很順利的轉出Java Code,接下來開始測試時超不順利的,遇到了二個狀況。

  • 狀況一:廠商要求在Header 中加入 Security 相關資料
    由於 Stub Client 程式是工具產生出來的,所以若要加入額外的 Header時,需要自己先組好 XML 後,在你呼叫你Service 前加入 Header,用法如下:
    stub._getServiceClient().addHeader(header);
  • 狀況二:當我加入廠商提供的 Session 機制時一直收到錯誤的 Header 訊息,透過SOAP UI 測試,發現在 Session 的內容會多出的:mustUnderstand:mustUnderstand="0" 相關內容,經追查底層 Framework,他確實執行了某一行程式造成此問題,解決方法如下:
    修改工具產生出來的 stub or 新增一個 stub 去繼承原先的 stub,然後加入下列程式

    @Override
    protected void addHeader(OMElement omElementToadd, SOAPEnvelope envelop, boolean mustUnderstand) {
        SOAPHeaderBlock soapHeaderBlock = envelop.getHeader().addHeaderBlock(omElementToadd.getLocalName(),
            omElementToadd.getNamespace());
        // 官方寫法
        // soapHeaderBlock.setMustUnderstand(mustUnderstand);
        // 調整後寫法
        if (mustUnderstand) {
            soapHeaderBlock.setMustUnderstand(mustUnderstand);
        }
        OMNode omNode = null;
        for (Iterator iter = omElementToadd.getChildren(); iter.hasNext();) {
            omNode = (OMNode) iter.next();
            iter.remove();
            soapHeaderBlock.addChild(omNode);
        }
    
        OMAttribute omatribute = null;
        // add attributes
        for (Iterator iter = omElementToadd.getAllAttributes(); iter.hasNext();) {
            omatribute = (OMAttribute) iter.next();
            soapHeaderBlock.addAttribute(omatribute);
        }
    }
    

做了上述的變動後,目前測試上都正常了。

Related Posts

發佈留言