報錯信息

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