论坛首页 Java企业应用论坛

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

浏览 2257 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2008-12-09   最后修改:2008-12-09

这段时间在用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中所有的方法。这个时候后取到的是第一个方法。

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

新手发帖请各位指正!

 

 

 

 

 

   发表时间:2009-11-17  
今天遇到同样的问题了,谢谢!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics