spring-cloud-starter-openfeign:无效的 HTTP 方法:PATCH 执行 PATCH

Kri*_*ris 6 http-patch spring-cloud-feign feign

语境

我有一个 spring boot (version 2.2.6.RELEASE) web 项目。

从这个 Web 应用程序(我称之为“APP1”)我想使用来自另一个 Web 应用程序的 PATCH 方法调用另一个 URI(我们称之为“APP2”)。在我的 pom.xml 中,我有以下依赖项:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

下面是我如何调用其他 Web 应用程序的 PATCH 方法。

@FeignClient(name = "clientName", url = "base-uri")
public interface MyInterface{
   @PatchMapping(value = "/target-uri")
    void callClientMethod(Map<String, Object> args);
Run Code Online (Sandbox Code Playgroud)

问题

  • APP2 的 PATCH 方法被有效调用
  • 但随后 APP1 抛出以下错误:
    • feign.RetryableException:无效的 HTTP 方法:PATCH 正在执行 PATCH

我在互联网上寻找解决方案,并在我的 pom.xml 中添加了以下 snipet

<dependency>
    <groupId>com.netflix.feign</groupId> <!-- Also tried io.github.openfeign -->
    <artifactId>feign-httpclient</artifactId>
    <version>8.18.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

之后,APP2 的 PATCH 方法仍然被正确调用,但在 APP1 中我收到以下错误: java.lang.NoSuchMethodError: feign.Response.create (ILjava/lang/String;Ljava/util/Map;Lfeign/Response$Body;)假/响应;

  • 有谁知道如何解决这个错误?

在此先感谢您的帮助 !

Ale*_*hko 16


我遇到了同样的问题,花了很多时间来理解和解决这个问题。
首先,您需要了解的是,Feign 不支持从框中调用 PATCH http 方法!
如果您可以更改两个服务中的方法,请使用 PUT 进行更新而不是 PATCH...

但是如果您与第三方实现集成,您应该添加一些配置:
1. 添加支持 PATCH http 方法的依赖项:

// https://mvnrepository.com/artifact/io.github.openfeign/feign-okhttp
编译组:'io.github.openfeign',名称:'feign-okhttp',版本:'10.2.0'

  1. 添加配置:
@Configuration 
public class FeignConfiguration {
    @Bean
    public OkHttpClient client() {
        return new OkHttpClient();
    } 
}
Run Code Online (Sandbox Code Playgroud)
  1. 以及带有 Feign 的 PATCH 请求示例:
@FeignClient(name = "someapi", url = "${client.someapi.url}")
@Component
@RequestMapping("/users")
public interface SomeClient {

    @RequestMapping(value = "/{id}",
            method = RequestMethod.PATCH,
            consumes = MediaType.APPLICATION_JSON_VALUE,
            produces = MediaType.APPLICATION_JSON_VALUE)
    FeignUser update(@PathVariable("id") Long id, @RequestBody Map<String, Object> fields);
}
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助某人。

  • 这应该是公认的答案。有同样的问题,这解决了它 (2认同)

Jay*_*Jay 6

只需添加:

<dependency>
     <groupId>io.github.openfeign</groupId>
     <artifactId>feign-httpclient</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

  • 这本身还不够,您还需要提供 feign.httpclient.enabled: true 。 (2认同)

小智 -1

以下配置对我有用:

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-jackson</artifactId>
    <version>${feign.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
    <version>${feign.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

在哪里:

feign.version - 11.0
Spring Boot - 2.3.0.RELEASE
Spring-cloud.version - 2.2.3.RELEASE