1. 程式人生 > >Axis1.4開發webService中遇到的問題及解決方案

Axis1.4開發webService中遇到的問題及解決方案

1.Asix版本衝突的問題

專案是一個維護+二次開發的,有axis1.0(是之前開發的人沒有刪除掉)和axis1.4兩個jar包,之前很少有人用到,所有沒有發現問題

客戶提供了wsdl檔案,我用的是wsdl2Java生成的客戶端呼叫程式碼,裡面有兩行程式碼:

        oper.setStyle(org.apache.axis.enum.Style.WRAPPED);
        oper.setUse(org.apache.axis.enum.Use.LITERAL);
enum應該是被認定成了關鍵字,這裡採用axis1.0會報錯的, 用axis1.4的jar包就沒問題了

1. 工程中設定代理問題

需求中遇到webService要通過代理伺服器呼叫,使用常用的Service.  call 直接呼叫不成功(這也是為什麼上面要使用wsdl2Java生成程式碼直接用SOAP方式呼叫的原因了,後來實驗發現應該也是可以呼叫的,不過要手動設定各種引數==,還是用自動生成的規範一些

另外,在方法呼叫前,要設定代理。可以用

AxisProperties.setProperty("http.proxyHost", proxyHost); 
AxisProperties.setProperty("http.proxyPort", proxyPort);

  1. Properties prop = System.getProperties();   
  2.   prop.put("http.proxyHost",proxyHost);   
  3.   prop.put("http.proxyPort",proxyPort);  
注意: 在簡單的測試環境中,可能不會發現問題

這裡的AxisProperties設定的是一個全域性的靜態變數,生命週期是application 其中的值一但設定不能修改,remove 置空等等操作都無法改變其值。這就造成了  一旦設定代理,將會影響訪問其它使用axis但不通過代理伺服器呼叫webService的功能。

如果其它axis呼叫先執行,也會隱性的設定AxisProperties值,造成我們需要代理的webService無法呼叫

為了解決這一問題經過長時間搜尋找到了設定例外列表這一方式:

	AxisProperties.setProperty("http.nonProxyHosts", nonProxyHosts); //設定HTTP訪問不需要通過代理伺服器訪問的主機
可以使用*萬用字元,多個地址用|分隔, 如10.*.*.*|12.*.*.*

為了統一控制管理代理,和儘可能少的修改原有的程式碼。這裡加入了一個ServletContextListener監聽, 在專案載入時就設定代理伺服器和例外列表。從而較合理的解決了這一問題

缺陷也很明顯,如果專案中的webService需要設定多個代理,就力不從心了, 至少目前未找到合適的解決方案