Kris
Kris

Reputation: 479

spring-cloud-starter-openfeign: Invalid HTTP method: PATCH executing PATCH

Context

I have a spring boot (version 2.2.6.RELEASE) web project.

From this web application (I call "APP1") I want to call another URI using the PATCH method from another web application (Let's call it "APP2"). In my pom.xml, I have the following dependency:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

Here is how I call the PATCH method of the other web application.

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

Problem

I looked on the Internet for a solution, and added the following snipet to my pom.xml

<dependency>
    <groupId>com.netflix.feign</groupId> <!-- Also tried io.github.openfeign -->
    <artifactId>feign-httpclient</artifactId>
    <version>8.18.0</version>
</dependency>

After that, APP2's PATCH method is stille properly called but in APP1 I got the following error : java.lang.NoSuchMethodError: feign.Response.create(ILjava/lang/String;Ljava/util/Map;Lfeign/Response$Body;)Lfeign/Response;

Question

Thanks in advance for your help !

Upvotes: 16

Views: 36535

Answers (5)

E.Big
E.Big

Reputation: 771

Only one worked for me:

  1. Add feign-okhttp as additional dependency into build.gradle.kts
implementation("org.springframework.cloud:spring-cloud-starter-openfeign:4.0.3")
implementation("io.github.openfeign:feign-okhttp:13.5")
  1. Create feign.okhttp.OkHttpClient bean (that replacing default HttpConection)

@Bean
fun okHttpClient() = OkHttpClient.Builder()
        .retryOnConnectionFailure(true)
        .build()

@Bean
fun feignClient(client: OkHttpClient) = feign.okhttp.OkHttpClient(client)

Upvotes: 0

Eugene Maysyuk
Eugene Maysyuk

Reputation: 3378

If you are adding Feign with the following dependency:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId> <!-- has dependecy on spring-cloud-openfeign-core inside, which already maintains version of feign-okhttp artifact -->
</dependency>

you can add okhttp client (without hardcoding artifact version) to fix the issue with PATCH request:

<dependency>
      <groupId>io.github.openfeign</groupId>
      <artifactId>feign-okhttp</artifactId> <!-- Required to use PATCH -->
</dependency>

No other steps needed. The okhttp client will be applied automatically by auto configuration.

Also, this way you don't need to manage feign-okhttp artifact version. Spring Cloud will manage version for you.

Tested with Spring Boot 2.7.6

Upvotes: 3

Jay Ehsaniara
Jay Ehsaniara

Reputation: 1529

Just Add:

<dependency>
     <groupId>io.github.openfeign</groupId>
     <artifactId>feign-httpclient</artifactId>
</dependency>

Upvotes: 14

Dharma
Dharma

Reputation: 1

The following config works for me:

<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>

Where:

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

Upvotes: -1

Olexander Yushko
Olexander Yushko

Reputation: 2854


I had the same problem and spent a lot of time for understand and resolve this problem.
First what you need to understand that is the Feign doesn't support PATCH http method for call from the box!
And if you can change methods in both services use PUT for update instead PATCH...

But if you integrate with third party implementation you should add some configurations:
1. Add dependency which support PATCH http method:

// https://mvnrepository.com/artifact/io.github.openfeign/feign-okhttp
compile group: 'io.github.openfeign', name: 'feign-okhttp', version: '10.2.0'

  1. Add configuration:
@Configuration 
public class FeignConfiguration {
    @Bean
    public OkHttpClient client() {
        return new OkHttpClient();
    } 
}
  1. And example for PATCH request with Feign:
@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);
}

Hope it helps someone.

Upvotes: 43

Related Questions