2016年4月6日 星期三

ADBException: Any type element type has not been given

這陣子在做API改寫時,我用了Dynamic Proxy Pattern統一處理了Service層級的API Response與Exception Handler。
現在的團隊使用Apache Axis2建立WebService,雖然使用的是WSDL、SOAP,但回傳的格式不是XML,而是JSON String,所以Service層的回傳型態都是String。
代理將Service Return的東西做了Object to Json String與外層格式的統一處理,所以Proxy實際回傳的是JSON String,Servcie的Impl回傳的東西可能是各種形態。因為Proxy與Implement回傳的型態是不同的,所以Service Interface的回傳型態必須改為Object
問題來了,Axis2 Service不能回傳Object型別,因為Axis2 adb有bug,ADB handles anyType
在使用Axis2 Code Generator Tool做WSDL2Java產生stub後,會看到只要回傳型態為Object時,(WSDL XML Return type就會是type:anyType),產生出來的stub code就會在API回傳的時候,試著要在回傳的XML資料內找到type,並嘗試將回傳資料轉型(ConverterUtil.getAnyTypeObject(...)),但是記得嗎??最一開始我就提到了,回傳的格式不是XML,而是JSON String,所以根本不會有type,在找不到type屬性的情況下CnverterUtil索性就丟了一個ADBException(as my title)。
Workaround的解法有兩種:
解法一,override ConverterUtil getAnyTypeObject Method,替換掉丟出異常的那一行
returnObject = xmlStreamReader.getElementText();

沒有留言:

張貼留言