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中所有的方法。这个时候后取到的是第一个方法。
以上所述表明,无法调用方法重载的远端服务,至少会有可能不准确。提出的方案是将调用的方法的参数也传到服务端,再通过方法名和参数调用准确的方法。不知道是否合理。
新手发帖请各位指正!
推荐阅读
-
python多线程调用exit无法退出的解决方法
-
C++ 调用Python3 脚本中无法引入内建模块的问题解决方法
-
python多线程调用exit无法退出的解决方法
-
妙用缓存调用链实现JS方法的重载
-
hessian无法调用远端的重载方法
-
hessian无法调用远端的重载方法
-
C#通过重载构造函数传递参数、实现两个窗体下的方法的互相调用
-
Hutool工具类BigExcelWriter导出Excel调用autoSizeColumnAll()方法无法自适应列宽度的问题
-
解决spring AOP中自身方法调用无法应用代理的问题
-
dedecms的dededown类获取远程图片的函数用如下,调用的时候传递过去的也是有效,但是发现以下两句调用为空 无法获取解决方法