FeignClient 将 GET 方法转换为 POST

FeignClient converts GET method to POST

我不知道我做错了什么,但每次假装客户端将声明为 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();

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

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

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

在我的项目中,我使用 spring-cloud-dependenciesCamden.SR7 版本,其中包含 9.3.1 feign 版本,目前最新版本是 Finchley.RELEASE,其中包含 feign [=15] =] 我看到它专用于 spring-boot 2.x.x,但我的整个基础架构(config/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-cloud-dependencies 版本,它专用于 spring-boot 1.5.x 应用程序。

出于不同的原因,我遇到了 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.