spring-cloud-starter-openfeign: неверный метод HTTP: PATCH выполняет PATCH

Контекст

У меня есть веб-проект весенней загрузки (версия 2.2.6.RELEASE).

Из этого веб-приложения (я называю «APP1») я хочу вызвать другой URI, используя метод PATCH из другого веб-приложения (назовем его «APP2»). В моем pom.xml у меня есть следующая зависимость:

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

Вот как я вызываю метод PATCH другого веб-приложения.

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

Проблема

  • Метод PATCH APP2 фактически вызывается
  • But then APP1 throws the following error:
    • feign.RetryableException: Invalid HTTP method: PATCH executing PATCH

Я поискал в Интернете решение и добавил следующий фрагмент в свой pom.xml.

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

После этого метод PATCH APP2 по-прежнему вызывается правильно, но в APP1 я получил следующую ошибку: java.lang.NoSuchMethodError: feign.Response.create(ILjava/lang/String;Ljava/util/Map; Lfeign/Response$Body;)Lfeign/Response;

Вопрос

  • Кто-нибудь знает, как решить эту ошибку?

Заранее спасибо за вашу помощь !


person Kris    schedule 06.05.2020    source источник


Ответы (3)



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
группа компиляции: 'io.github.openfeign', имя: 'feign-okhttp', версия: '10.2.0'

  1. Добавить конфигурацию:
@Configuration 
public class FeignConfiguration {
    @Bean
    public OkHttpClient client() {
        return new OkHttpClient();
    } 
}
  1. И пример для запроса PATCH с 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);
}

Надеюсь, это поможет кому-то.

person Alexander Yushko    schedule 25.08.2020
comment
Это должен быть принятый ответ. Была такая же проблема, и это решило ее - person Bojan Trajkovski; 27.08.2020
comment
Это работает, спасибо. Мой проект spring-cloud-openfeign — 2.1.0.RELEASE и feign-okhttp — 10.12. - person Grisotto; 09.03.2021

Просто добавь:

<dependency>
     <groupId>io.github.openfeign</groupId>
     <artifactId>feign-httpclient</artifactId>
</dependency>
person Jay    schedule 23.02.2021
comment
Этого недостаточно, вам также необходимо предоставить feign.httpclient.enabled: true. - person Shannon; 04.08.2021
comment
Кроме того, если вы предпочитаете использовать Apache httpclient5, вы можете вместо этого использовать io.github.openfeign:feign-hc5 и предоставить feign.httpclient.hc5.enabled: true - person Shannon; 04.08.2021

У меня работает следующий конфиг:

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

Где:

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

person Dharma    schedule 27.07.2020
comment
Это не работает. Когда я добавил эти зависимости, я получаю InvocationTargetException для всех моих вызовов метода feign (GET/PUT/POST). - person Alexander Yushko; 25.08.2020