Axis1.4開發webService中遇到的問題及解決方案
阿新 • • 發佈:2019-01-06
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);
或
-
Properties prop = System.getProperties();
- prop.put("http.proxyHost",proxyHost);
- prop.put("http.proxyPort",proxyPort);
這裡的AxisProperties設定的是一個全域性的靜態變數,生命週期是application 其中的值一但設定不能修改,remove 置空等等操作都無法改變其值。這就造成了 一旦設定代理,將會影響訪問其它使用axis但不通過代理伺服器呼叫webService的功能。
如果其它axis呼叫先執行,也會隱性的設定AxisProperties值,造成我們需要代理的webService無法呼叫
為了解決這一問題經過長時間搜尋找到了設定例外列表這一方式:
AxisProperties.setProperty("http.nonProxyHosts", nonProxyHosts); //設定HTTP訪問不需要通過代理伺服器訪問的主機
可以使用*萬用字元,多個地址用|分隔, 如10.*.*.*|12.*.*.*
為了統一控制管理代理,和儘可能少的修改原有的程式碼。這裡加入了一個ServletContextListener監聽, 在專案載入時就設定代理伺服器和例外列表。從而較合理的解決了這一問題
缺陷也很明顯,如果專案中的webService需要設定多個代理,就力不從心了, 至少目前未找到合適的解決方案