今天,继续写登陆次数验证.本来想切面里面去切登录方法,拿到session,通过session判断用户是否已登录.还是有点图样图森破.Session的获取与创建在response之后就不可以了,会抛出异常.算了,就直接写在doLogin的Controller里面了.的确,只切一个方法,直接在方法里面写逻辑更优.噼里啪啦写完实现之后开始运行项目.点击登录.啪唧.啥反应都没.response里面已经跳到错误异常页面了.查看了下console的输出.NullPointException.
然后进入了一下午的DeBug,只要执行完了service的方法就会报错.尝试过try,catch包裹整个serviceImpl,并没有捕获到任何异常.找了我的导师和另一个大佬帮我DeBug,改了很久都没想到为什么会出现这个NullPointException,最后大佬试了下改了我的方法名.将void addFailedTime(LoginRecordDto selectDto);改为了void updateFailedTime(LoginRecordDto selectDto);竟然成功不报错了.他对我说可能是切面的问题,重复切了.贴下方法,和几个切点.
我试着进入另一个方法的时候,发现还是报了NullPointException,
是的,肯定没这么简单.不过也提醒了我,很有可能是这个ServiceAspect的鬼.去updateMethod的切点所在的通知那里看了下,没有问题.那问题肯定是出现在addMethod的切点了.
问题就出现在通知的注释上,returning="rtv",我的两个方法都是void,但是都是以add起头的.被匹配到了,然后因为得不到返回值,equals方法直接抛出了NullPointException.至此,问题解决.还是多亏了老哥提醒的切点名称匹配,虽然不是那个原因,但是还是想到啦.修改了下.功能测试完也没有问题.
顺便复习下切面各个方法的顺序:
- 如果是正常返回的是around -> before-> joinPoint.proceed() -> around -> after -> afterReturing.
- 抛出异常的则是.around -> before-> joinPoint.proceed() -> after -> afterThrowing.