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

avatar 2018年10月30日17:58:23 6 12669 views
博主分享免费Java教学视频,B站账号:Java刘哥 ,长期提供技术问题解决、项目定制:本站商品点此
先介绍一下 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
  • 个人淘宝
  • 店铺名:言曌博客咨询部

  • (部分商品未及时上架淘宝)
avatar

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0