java中的接口是类吗
484
2022-08-20
SpringCloud:feign对象传参和普通传参及遇到的坑解决
目录feign对象传参和普通传参及遇到的坑对象传参普通传参遇到的坑-1遇到的坑-2feign传递复杂参数对象需要注意的地方传递复杂参数对象需要用Post在传递的过程中
feign对象传参和普通传参及遇到的坑
对象传参
使用@RequestBody来指定传参对象
@RequestMapping(value = "/v2/matterCode/genCode", method = RequestMethod.POST)
ResultResponse
注意:@RequestBody在一个方法内有且只有一个,不能同时存在两个!
普通传参
普通传参使用@RequestParam来指定参数
@RequestMapping(value = "taskApiController/getAll", method = RequestMethod.POST)
List
注意:@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 exceptioncom.netflix.hystrix.exception.HystrixRuntimeException: TaskFeignClient#getAll() failed and no fallback available. at com.netflix.hystrix.Abstrahttp://ctCommand$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);
}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~