全部產品
Search
文件中心

Enterprise Distributed Application Service:錯誤編碼:HSF-0029

更新時間:Jun 30, 2024

報錯資訊

調用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用戶端。