SpringBoot⼯程下使⽤OpenFeign的坑及解决
⼀、前⾔
在SpringBoot⼯程(注意不是SpringCloud)下使OpenFeign的⼤坑。为什么不⽤SpringCloud中的Feign呢?
⾸先我的项⽬⽐较简单(⽬前只有login与业务模块)所以暂时不去引⼊分布式的架构,但两个服务之间存在⼀些联系因此需要接⼝调⽤接⼝(实现该操作⽅式很多我选择了OpenFeign,踩坑之路从此开始。。。)。
⼆、具体的坑
使⽤OpenFeign我是直接参考官⽅的demo,官⽅的例⼦写的简洁明了直接套⽤到⾃⼰的⼯程中即可,⾃⼰也可以做相应的封装再调⽤但demo中使⽤到了⼀个feign的核⼼注解@RequestLine,问题就是出在该注解上。
此时你去做调试如果使⽤的是GET请求,被请求的接⼝则会收到POST的请求然后A接⼝(请求⽅)就报500的错误,B接⼝(被请求⽅)则提⽰接⼝不⽀持POST请求(不⽀持POST请求是⾮常正常的,因为B接⼝定义的method是GET⽅法)。
以下是我的代码⽚段:
⾃定义UserFeign接⼝
public interface UserFeign {
/**springboot是啥
* 根据userId获取⽤户信息
* @param userId
* @return
*/
@RequestLine("GET /user/getUserById?id={id}")
Result getUserById(@Param("id") String userId);
}
调⽤UserFeign接⼝
@Service
public class UserService{
/**
* 通过OpenFegin实现接⼝调⽤接⼝
* @param userId
* @return
*/
public Result getUserByIdWith(String userId) {
UserFeign userInfo = Feign.builder()
.decoder(new JacksonDecoder())
.
target(UserFeign.class, "localhost:8080");
Result res = UserById(userId);
return res;
}
}
A接⼝(请求⽅)
@RequestMapping(value = "/test", method = RequestMethod.GET)
public Result test() {
String id = "ad545461300a";
UserByIdWith(id);
}
B接⼝(被请求⽅)
@RequestMapping(value = "/getUserById", method = RequestMethod.GET)
public Result getUserByUserId(@RequestParam(required = true) String id){
if ("".equals(id)) {
throw new BusinessException(400, "userId不能为空!");
}
Users info = UserById(id);
if (info == null) {
throw new BusinessException(404, "userId有误!");
}
return ResultUntil.success(info);
}
以上代码我做了⼀些⼩调整,将调⽤UesrFeign接⼝中的⽅法封装在UserService中并且使⽤了@service这样我就可以在其它地⽅直接注⼊UserService然后调⽤其中⽅法。
你会觉得以上代码跟官⽹的demo没啥区别但官⽅⽂档中并没有说明使⽤@RequestLine注解需要进⾏配置(事实上需要进⾏配置的)。
配置代码如下:
@Bean
public Contract useFeignAnnotations() {
return new Contract.Default();
}
完成以上的配置就可以进⾏正常的调⽤了,该问题困扰我好⼏天了今天终于解决了(真不容易),希望该⽂章没有⽩写。
最后感谢让我在放弃的时候到了思路。(调试中遇到的细节问题就不在此进⾏赘述了)
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论