欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

hessian无法调用远端的重载方法  

程序员文章站 2022-07-14 17:29:15
...

这段时间在用hessian,发现无法很好的支持方法重载。原有的程序接口如下。

/**
 * @author sagahl
 *
 */
public interface DisCountService {

	/**双方验证签名的md5key*/
	public String md5key = "xxxxxxxxxxxxx";
	/**
	 * 根据xx查询aDiscountQueryVO 查询
	 * @param DiscountQueryVO aDiscountQueryVO
	 * @param  signature  --签名  ,对aDiscountQueryVO.userId 进行md5签名
	 * @return  DiscountResultVO
	 *
	 */
	public DiscountResultVO  getDiscountBy(DiscountQueryVO aDiscountQueryVO,String signature);


}

 由于业务的需要接口的入参需要更改,但是又需要保留原有的接口方法名。于是定义接口如下:

public interface DisCountService {

	/**双方验证签名的md5key*/
	public String md5key = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
	/**
	 * @param DiscountQueryVO aDiscountQueryVO
	 * @param  signature  --签名  ,对aDiscountQueryVO.userId 进行md5签名
	 * @return  DiscountResultVO
	 *
	 */
	public DiscountResultVO  getDiscountBy(DiscountQueryVO aDiscountQueryVO,String signature);
	
	/**
	 * @param DiscountQueryVO aDiscountQueryTwoVO
	 * @param  signature  --签名  ,对aDiscountQueryVO.userId 进行md5签名
	 * @return  DiscountResultVO
	 *
	 */
	public DiscountResultVO  getDiscountBy(DiscountQueryTwoVO aDiscountQueryTwoVO,String signature);
}

 通过不同的入参调用服务端不同的方法。但是发现服务端实现了两个方法,但通过调用

public DiscountResultVO  getDiscountBy(DiscountQueryTwoVO aDiscountQueryTwoVO,String signature);

发现在服务端实际调用的还是

public DiscountResultVO  getDiscountBy(DiscountQueryVO aDiscountQueryVO,String signature);

让我很疑惑不解。看了hessian的代码后才发现原因。

hessian中HessianSkeleton中的

    String methodName = in.readMethod();
    Method method = getMethod(methodName);

 是最终取得的反射的方法,methodName的值为getDiscountBy。getMethod(methodName)的实现是

  protected Method getMethod(String mangledName)
  {
    return (Method) _methodMap.get(mangledName);
  }

 而_methodMap的值是接口DisCountService中所有的方法。这个时候后取到的是第一个方法。

以上所述表明,无法调用方法重载的远端服务,至少会有可能不准确。提出的方案是将调用的方法的参数也传到服务端,再通过方法名和参数调用准确的方法。不知道是否合理。

新手发帖请各位指正!