一次Maven依赖问题导致Feign接口报错 not annotated with HTTP method type (ex. GET, POST)

先介绍一下 Maven 中依赖 <dependency> 中的 scope 的作用

如下

  1. <dependency>
  2.     <groupId>com.liuyanzhao</groupId>
  3.     <artifactId>oneid-account-api</artifactId>
  4. </dependency>

scope通常有 compile、provided、runtime 几种,未设置时默认是 compile。

compile (编译范围)

compile是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath 中可用,同时它们也会被打包。

provided (已提供范围)

provided 依赖只有在当JDK 或者一个容器已提供该依赖之后才使用。例如, 如果你开发了一个web 应用,你可能在编译 classpath 中需要可用的Servlet API 来编译一个servlet,但是你不会想要在打包好的WAR 中包含这个Servlet API;这个Servlet API JAR 由你的应用服务器或者servlet 容器提供。已提供范围的依赖在编译classpath (不是运行时)可用。它们不是传递性的,也不会被打包。

runtime (运行时范围)

runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如,你可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC
驱动实现。

 

然后来说之前遇到的一个报错:not annotated with HTTP method type (ex. GET, POST)。

这个报错的意思就是没有对应的请求方法,在 SpringCloud 项目中,比如 Web 层需要调用 Service 接口,需要添加 Feign API 接口依赖,调用方法的时候,只需要根据 FeignClient 的 value 和 RequestMapping 路径来请求调用。如果在注册中心找不到对应的 FeignClient 的 value 和 RequestMapping 路径,就可能会报上面的错误。

 

但是,我们公司的项目,为了支持 HTTP 和 RPC 两种调用,也就是方便把项目从 SpringCloud/Dubbo/HSF 等微服务框架中快速切换。所以每个 API 接口都有两份,一个是普通的接口,一个是Feign接口。

这次遇到的问题原因是因为在依赖里既有Feign接口,又有普通接口

通过Debug发现,调用的方法都没有注解,说明调用的是普通接口,而非我们需要的Feign接口。

最后解决办法是将普通API接口依赖添加一个 <scope>provided</scope>,表示编译时使用,运行时不打包。就不会出现既有 Feign API 接口依赖,又有普通API接口依赖了。

  1. <dependency>
  2.     <groupId>com.liuyanzhao.blog</groupId>
  3.     <artifactId>oneid-user-api</artifactId>
  4.     <scope>provided</scope>
  5. </dependency>

 

 

 

  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
言曌

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: