这篇文章给大家分享的是有关SpringCloud怎么使用feign时的复杂参数传递的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
Feign传参注意
最近在用SpringCloud尝试重构以前的项目,使用Feign客户端组件来调用微服务,经常出现参数传不过去变成null的问题,网上查了一下发现feign在参数上的使用还是有一定的限制的,主要是要注意:
当参数比较复杂时,feign即使声明为get请求也会强行使用post请求
不支持@GetMapping类似注解声明请求,需使用
@RequestMapping(value = "url",method = RequestMethod.GET)
使用@RequestParam注解时必须要在后面加上参数名
写了一个简单案例,同时传输一个对象和一个字符串作为请求参数,主要关注参数的声明,其余比如eureka和feign的依赖和配置和后续使用相关的知识请另行查阅。仅供参考
服务端(生产者)
准备:
已经配置将服务注册在eureka,服务名为“item-service”
service层和dao层已经实现好了
逻辑:ItemController接收参数,调用service层,service中为商品Item对象添加详情desc,然后调用dao保存Item对象,返回Result结果封装对象
@RestControllerpublic class ItemController { @Autowired private ItemService itemService; @RequestMapping("/item/save") public Result addItem(@RequestBody Item item, @RequestParam("desc") String desc){ return itemService.addItem(item, desc); }}
客户端(消费者)
准备: 已经配置注册到eureka
逻辑:
声明ItemFeignClient调用eureka上名为"item-service"的服务,返回Result对象
使用Post请求,传递两个参数:
TbItem对象,使用@RequestBody来声明
String字符串,使用@RequestParam("xxx")来声明
@FeignClient("item-service")public interface ItemFeignClient { @RequestMapping(value = "/item/save",method = RequestMethod.POST) Result addItem(@RequestBody TbItem item, @RequestParam("desc") String desc);
SpringCloud feign参数传递问题记录
对象传递 @RequestBody(required = false)
不支持多对象传递,至少我目前发现是这样的,如有错误或者改进的方法请提出
API层
@FeignClient(value = "transaction-feign") public interface TransactionApiService { @RequestMapping(value = "/dealflow/list", method = RequestMethod.POST) JsonResultDO dealFlowList(@RequestBody(required = false) DealFlowDo param , @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum , @RequestParam(value = "pageSize", defaultValue = "20") Integer pageSize); }
接口层
@RequestMapping(value = "/dealflow/list", method = RequestMethod.POST)public Page<DealFlowDo> dealFlowList(@RequestBody(required = false) DealFlowDo param , @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum , @RequestParam(value = "pageSize", defaultValue = "20") Integer pageSize , @RequestParam(value = "userId") Long userId){ JsonResultDO resultDO = new JsonResultDO(); Page<DealFlowDo> page = (Page<DealFlowDo> )dealFlowService.queryDealFlowList(userId, param, pageNum, pageSize); return page;}
单个或多个参数传递 @RequestParam/@PathVariable @RequestMapping(value = "/merchant/{merNo}", method = RequestMethod.GET) String getMerchantByMerNo(@PathVariable("merNo") String merNo);
感谢各位的阅读!关于“SpringCloud怎么使用feign时的复杂参数传递”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!