这段时间在用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中所有的方法。这个时候后取到的是第一个方法。
以上所述表明,无法调用方法重载的远端服务,至少会有可能不准确。提出的方案是将调用的方法的参数也传到服务端,再通过方法名和参数调用准确的方法。不知道是否合理。
新手发帖请各位指正!