问题描述

在调用HSF服务时,出现There is no TOP transformer for Service:[${serviceUniqueName}].报错。

问题原因

TOP调用方式是为了避免网关应用依赖后端服务的API包,TOP调用在服务端进行转换时,没有找到对应的transformer。

解决方案

在服务端初始化时,请通过com.taobao.hsf.ServiceInvokeTransform.Helper#register注册一个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客户端。

适用于

  • 企业级分布式应用服务EDAS

如果您的问题仍未解决,您可以在阿里云社区免费咨询提交工单联系阿里云技术支持。