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

0607又一次出现了奇怪的现象

程序员文章站 2022-04-27 08:51:42
...

又一次奇怪的现象

测试环境下的观察日志发现的问题:检查验证码这个接口,调用了两次,而且入参的类型不一样,更奇怪的是这个check方法要求的形参是SmsCheckInput类型啊!!!日志如下:

0607又一次出现了奇怪的现象

很奇怪,调用了两次check接口,而且第二次的时候,入参类型是:CardBindNewInput:

********【本地接口-检查验证码】入参:com.uroad.etc.dto.SmsCheckInput@2a9edb61
********【本地接口-检查验证码】入参:com.uroad.etc.dto.CardBindNewInput@14948778

让我吃惊的是,我的check方法,要求的参数是SmsCheckInput类型的:

check(SmsCheckInput input) 

所以,为什么会出现check方法的日志记录是CardBindNewInput类型???????而且为什么调用了两次???

好奇怪。我问德勇,check接口不是调用一次吗,他说的是的,先调用check接口,通过之后再调用bind绑卡接口。

突破点

又观察了一下日志,第二次调用的检查验证码接口,入参CardBindNewInput对象与绑卡接口中的入参是一样的:

********【本地接口-检查验证码】入参:com.uroad.etc.dto.SmsCheckInput@2a9edb61
********【本地接口-检查验证码】入参:com.uroad.etc.dto.CardBindNewInput@14948778
********【仪电2011云通卡绑卡】入参:com.uroad.etc.dto.CardBindNewInput@14948778

很奇怪很无法理解,我在想,是不是log日志有问题!!!!!!!!!

但是感觉和bind绑卡接口有关。于是去看了下bind绑卡接口的代码,最后发现,果然和bind接口有关。

原因

因为在绑卡bind方法中调用了check方法,传入的参数类型就是CardBindNewInput的,而check方法接收的参数类型是SmsCheckInput类型:

public void bindNew(CardBindNewInput input) throws Exception {

    String logData = "\n" + "********【仪电2011云通卡绑卡】useruuid=="+input.getUseruuid();
    logData += "\n" + "********【仪电2011云通卡绑卡】入参:" +input;
    try {

        smsService.check(input);
        。。。后面代码略
}
public void check(SmsCheckInput input) throws Exception {
    String logData = "\n" + "********【本地接口-检查验证码】==useruuid=="+input.getUseruuid() + ",phone==" + input.getPhone();
    logData += "\n" + "********【本地接口-检查验证码】入参:" +input;
    。。。略
}

但是,check方法要求的参数是SmsCheckInput类型,而bind方法中调用check方法时传入的是CardBindNewInput对象,为什么可以这样?

肯定是有继承关系,点击去一看,果然如此:

public class CardBindNewInput extends SmsCheckInput implements Serializable 

原来!!是因为CardBindNewInpu类是SmsCheckInput的子类!!!!所以才能调用smsService.check(cardBindNewInput)方法。所以在check方法的打印的日志里会出现参数类型为CardBindNewInput类型!!!

所以,要注意在a接口方法调用b接口的问题。日志没处理好会很疑惑。

为什么在bind方法里还要调用check方法

德勇说,调用绑卡bind接口前会先调用检查验证码check接口,那我为什么bind方法里还要调用check方法。

我的理解是,为了防止用户或者说app端没控制好:没在调用bind接口之前先调用check接口,这样的话直接访问bind接口,就会跳过检查验证码这一操作。

所以bind方法里还是得加上check方法。

感悟

之所以会出现这个问题,是因为我对系统的日志功能进行了相应的改进。之前也是有这个问题,只是由于日志太混乱,所以没看出这个问题。

刚出现这个问题的时候,真的很震惊,为什么会这样!!!为什么会调用两次?为什么check方法要求的形参是SmsCheckInput而日志里显示的是CardBindNewInput,为什么第二次的check接口和绑卡接口的日志记录的入参是一样的。甚至怀疑是不是log日志功能有问题。

最后发现,原来是这样子。我觉得做程序员好玩就好玩在有时你会遇到一些你无法接受无法理解的事情,甚至颠覆你的认知,但是当你把问题搞懂后,你会豁然开朗,啊原来是这样的,哈哈哈哈。原来是自己没注意到一些细节,导致出现了颠覆认知的结果。

搞懂之后,会感慨:啊,原来是这样,真有意思。