先介绍一下 Maven 中依赖 <dependency> 中的 scope 的作用
如下
scope通常有 compile、provided、runtime 几种,未设置时默认是 compile。
然后来说之前遇到的一个报错: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接口依赖了。
如下
- <dependency>
- <groupId>com.liuyanzhao</groupId>
- <artifactId>oneid-account-api</artifactId>
- </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接口依赖了。
- <dependency>
- <groupId>com.liuyanzhao.blog</groupId>
- <artifactId>oneid-user-api</artifactId>
- <scope>provided</scope>
- </dependency>
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏