温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SpringCloud feign对象传参和普通传参及遇到的坑如何解决

发布时间:2022-03-16 10:29:38 来源:亿速云 阅读:330 作者:iii 栏目:开发技术

这篇文章主要介绍“SpringCloud feign对象传参和普通传参及遇到的坑如何解决”,在日常操作中,相信很多人在SpringCloud feign对象传参和普通传参及遇到的坑如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringCloud feign对象传参和普通传参及遇到的坑如何解决”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

feign对象传参和普通传参及遇到的坑

对象传参

使用@RequestBody来指定传参对象

@RequestMapping(value = "/v2/matterCode/genCode", method = RequestMethod.POST)
    ResultResponse<String> getCode(@RequestBody MatterCodeBO matterCodeBO);

注意:@RequestBody在一个方法内有且只有一个,不能同时存在两个!

普通传参

普通传参使用@RequestParam来指定参数

@RequestMapping(value = "taskApiController/getAll", method = RequestMethod.POST)
List<TaskVO> getAll(@RequestParam("name") String name);

注意:@RequestParam必须指定参数名("name"),否则报错:RequestParam.value() was empty on parameter 0

遇到的坑-1

首先再次强调Feign是通过http协议调用服务的,重点是要理解这句话,

如果FeignClient中的方法有@PostMapping注解 ,则微服务TaskApiController中对应方法的注解也应当保持一致为@PostMapping,如果不一致,则会报404的错误 

调用失败后会触发它的熔断机制,如果@FeignClient中不写@FeignClient(fallback = TaskFeignClientDegraded.class),会直接报错

    11:00:35.686 [http-apr-8086-exec-8] DEBUG c.b.p.m.b.c.AbstractBaseController - Got an exception
com.netflix.hystrix.exception.HystrixRuntimeException: TaskFeignClient#getAll() failed and no fallback available.
    at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:819)
    at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:804)

遇到的坑-2

报错信息:

feign.FeignException:status 400 reading xxx#xxxx(String); content:

原因:因为feign的那个方法使用的@ReqestParam注解,这个接收的参数长度过长造成的,这也是feign就算使用post方法,参数也会放在请求地址后面,而不是放在请求体里面。

解决办法:将参数封装成对象,使用@RequestBody标明参数

feign传递复杂参数对象需要注意的地方

传递复杂参数对象需要用Post

另外需要注意,Feign不支持使用GetMapping 和PostMapping

@RequestMapping(value="user/save",method=RequestMethod.POST)

在传递的过程中

复杂对象使用@RequestBody进行注解,同时接收端也需要使用@RequestBody这个注解。 

我遇一个坑:

消费端使用了@RequestBody而服务端没有接收@RequestBody,这时参数会接收不完整。

//消费端
    @RequestMapping(value="user/save",method=RequestMethod.POST)
    public User save(@RequestBody User user);
//服务端
@PostMapping("save")
    public User save(@RequestBody User user) {
        System.out.println(user);
        return UserService.save(user);
    }

到此,关于“SpringCloud feign对象传参和普通传参及遇到的坑如何解决”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI