【问题标题】:FeignClient converts GET method to POSTFeignClient 将 GET 方法转换为 POST
【发布时间】:2019-04-19 18:40:44
【问题描述】:

我不知道自己做错了什么,但是每次 feign 客户端都将声明为 get 的方法转换为 post 类型。

@FeignClient(name = "my-service", url = "http://localhost:8114", path = "service")
public interface MyServiceClient {

    @RequestMapping(method = GET, value = "/clients")
    Client getClients(@QueryMap MyPojo pojo);
}

@Getter
@Setter
public class MyPojo {

    @NotNull
    private String someValue;
    @NotNull
    private SomeEnum someEnum;
}

此设置应解析为以下请求:
GET http://localhost:8114/service/clients?someValue=foo&someEnum=bar

但每次我得到这个结果时:

{
  "timestamp": 1542378765498,
  "status": 405,
  "error": "Method Not Allowed",
  "exception": "org.springframework.web.HttpRequestMethodNotSupportedException",
  "message": "Request method 'POST' not supported",
  "path": "/service/clients"
}

但是当我这样做时它工作正常:

@RequestMapping(method = GET, value = "/clients?someValue=foo&someEnum=bar")
Client getClients();

我正在开发包含feign-core/sl4fj/hystrix/ 9.3.1 版本的spring-cloud-starter-feign 1.2.7.RELASE 版本,但我也在10.1.0 版本上对其进行了测试,结果相同。

我应该怎么做才能解决这个问题?

【问题讨论】:

    标签: java spring spring-cloud-feign feign


    【解决方案1】:

    在我的项目中,我使用spring-cloud-dependenciesCamden.SR7 版本,其中包含9.3.1 feign 版本,目前最新版本是Finchley.RELEASE,其中包含feign 9.7,我看到它专用于spring-boot 2.x.x,但是我的整个基础架构(配置/eureka 服务器)在1.5.x 上运行,因此它会产生下一个问题。我查看了 feign 的 github 文档,发现 @Param 注释可能会有所帮助,但是当我在具有 3 个参数的方法中使用它时,它会抛出异常 Method has too many Body parameters~。最后,来自 spring 的注释 @RequestParam 可以作为解决方法,但我没有找到任何可以组合这些注释的信息来源。

    @RequestMapping(method = GET, value = "/clients")
    Client getClients(@RequestParam("someValue") String someValue, @RequestParam("someEnum") String someEnum);
    

    我没有找到包含9.7 feign 且专用于spring-boot 1.5.xapplications 的spring-cloud-dependencies 版本。

    【讨论】:

      【解决方案2】:

      正如已经讨论过的HERE:feign 9.3.1 确实支持@QueryMap with A POJO,你需要使用 Map,尝试更新到 feign 9.7 或 10.0.1

      【讨论】:

      • 我忘了提这个 - 我在使用 Map 时得到了同样的结果,我将 feign 升级到两个版本(9.7/10.0.1)仍然遇到这个问题,我会仔细检查一下然后回来。 Stacktrace 异常指向上面的库版本,我将尝试创建单独的项目并对其进行测试。
      【解决方案3】:

      我遇到了 Spring 的 @FeignClient 将 GET 请求转换为 POST 的实例,原因不同。在我的例子中,被调用的 REST API 使用 HTTP 查询参数。调用此 API 的 Feign 客户端方法有一个带有 @QueryParam 注释的参数(即 javax.ws.rs.QueryParam),用于此查询参数。 Feign 显然无法识别这个注解,因此将该方法参数用作请求正文中的表单 post 参数(并将请求方法转换为 POST),而不是将其用作查询参数。

      修复方法是将javax.ws.rs.QueryParam 注释替换为org.springframework.web.bind.annotation.RequestParam

      本案例使用 spring-cloud-openfeign-core-2.2.5.RELEASE 发生。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-02
        • 2020-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-20
        • 1970-01-01
        相关资源
        最近更新 更多