zoukankan      html  css  js  c++  java
  • SpringCloud: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标明参数

    文章转载至:https://blog.csdn.net/uotail/article/details/84673347

  • 相关阅读:
    exp 和imp 与expdp / impdp 区别
    nginx优化
    nginx root alias proxypass
    mysql3
    logrotate 用法
    SQL执行顺序
    http与RPC的关系
    docker
    windows 时间同步
    Java生成指定长度的随机字符串
  • 原文地址:https://www.cnblogs.com/nhdlb/p/12783453.html
Copyright © 2011-2022 走看看