報錯信息
調用HSF服務時,報錯信息如下。
There is no TOP transformer for Service:[${serviceUniqueName}].
解決方案
TOP調用方式是為了避免網關應用依賴后端服務的API包,TOP調用在服務端進行轉換時,沒有找到對應的transformer
。
客戶端設置
客戶端使用com.taobao.hsf.app.spring.util.SuperHSFSpringConsumerBeanTop
,該類無需服務端的接口包。通過com.taobao.hsf.app.spring.util.SuperHSFSpringConsumerBeanTop#invoke
發起調用。
示例代碼如下。
/**
* TOP調用該方法來訪問遠程HSF服務。
* <p>
* 這里需要注意的是parameterTypes參數,該參數表示要調用的方法的參數類型。 必須是完整的Java類名,而且如果參數是原子類型,這里的類型就是原子類型的名稱。
* </p>
*
* @return 對端業務響應或業務異常
*
* @throws HSFException
* 如果本側或對端HSF層出現錯誤,則拋出HSFException
* @throws Throwable
* 如果服務端業務出現異常,則拋出Exception
*/
public Object invoke(String methodName, String[] parameterTypes, Object[] args) throws HSFException, Throwable {
return consumerBeanTop.invoke(methodName, parameterTypes, args);
}
代碼中的args
不是真正的服務端業務類型。
服務端
服務端初始化時,需要通過com.taobao.hsf.ServiceInvokeTransform.Helper#register
注冊一個transformer
。
示例代碼如下。
/**
* 用于把服務的調用參數轉換成服務可以接受的形式。
*
* @param methodName
* 要調用的服務方法名
* @param args
* 轉換前的調用參數
* @param parameterTypes
* 要調用的服務方法的真實參數類型
*/
abstract public Object[] transformRequest(String methodName, Object[] args, String[] parameterTypes)
throws Exception;
/**
* 轉換請求參數類型
*
* @param methodName
* @param args
* @param parameterTypes
* @return
* @throws Exception
*/
abstract public String[] transformRequestTypes(String methodName, Object[] args, String[] parameterTypes)
throws Exception;
該transformer
服務在服務端將客戶端傳遞的參數轉化為真實的業務類型,HSF使用轉化后的參數進行業務調用,然后使用 transformer
將業務結果進行轉化后返回給TOP客戶端。