关于我们“顺利逃脱/通关”的真实原因?

关于我们“顺利逃脱/通关”的真实原因?


1.关于Feign的processAnnotationOnClass的疑问

    在视频中11:30左右时,老师说我们为什么顺利通关? 因为咱们没有用RequestMapping,咱用的是GetMappings。

    疑问点在于,这里GetMapping是在接口方法中的注解,和这里的接口类级注解不是一回事,没有用RequestMapping是因为接口类没有使用RequestMapping,如果在接口类使用RequestMapping,需要拼接接口类的URL和方法的URL,到最终的URL里面,这是这里检查类级注解的原因。

2.关于Feign的processAnnotationOnMethod的疑问

在视频12:10左右时,老师说因为我们的方法没有RequestMapping注解,所以我们也顺利逃脱了。

这里我就产生了疑问?如果老师说的是对的, 那么方法设置了RequestMapping注解,直接就return了。就无法注册到Metadata里面,这个请求调用应该会404或者其他的异常。

带着这个疑问,我测试了一下,发现方法上使用@RequestMapping注解没有任何问题,然后调试跟踪了这里面涉及到的两个校验:

if (!RequestMapping.class.isInstance(methodAnnotation) && !methodAnnotation

    .annotationType().isAnnotationPresent(RequestMapping.class)) {

    return;

}

这里是我调试后的理解:

RequestMapping.class.isInstance(methodAnnotation)  

    这里检查方法的注解是否是@RequestMapping的实例

    -> 当方法直接使用RequestMapping注解的时候,这里会返回True

methodAnnotation.annotationType().isAnnotationPresent(RequestMapping.class)

    这里检查方法的注解是否是@RequestMapping的子类

-> 当方法使用@GetMapping、@PostMapping等等@RequetsMapping的子类注解时,这里会返回True

所以,当且仅当这两个条件都不满足时,才会直接return不作处理,这样的方法Feign就不做代理了。


请老师指正。

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
姚半仙 2020-08-13 23:58:57

第一个地方传入的是class,没错那是验的class上面的注解,看走眼了以为传入的是method对象

第二个地方,两个判断条件中,第二个条件前面有个取反符号,因此用postmapping相当于true取反,还是false,用了requestmapping会return true

  • 提问者 Mr_Raymond #1
    这两个判断条件都是取反符号的,使用RequestMapping 也是不会return的 只有两个条件都不满足: 既没有使用RequesMapping注解,也没有使用GetMapping等子类注解的方法,才会直接被return 测试的结果也验证了使用@RequestMapping注解的方法,和使用@GetMapping注解的方法,流程上是一致的
    2020-08-14 00:07:34
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师