Spring Feign: не удалось извлечь ответ: не найдено подходящего HttpMessageConverter для типа ответа

Я пытаюсь заставить клиента Весеннее облако Netflix Feign получить немного JSON через HTTP и преобразовать его в объект. Вместо этого я продолжаю получать эту ошибку:

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class io.urig.checkout.Book] and content type [application/json;charset=UTF-8]

Вот фрагмент JSON, возвращенный удаленной службой:

{
    "id": 1,
    "title": "Moby Dick",
    "author": "Herman Melville"
}

Вот соответствующий класс, который я пытаюсь десериализовать:

package io.urig.checkout;

public class Book {
    private long id;
    private String title;
    private String author;

    public Book() {}

    public Book(long id, String title, String author) {
        super();
        this.id = id;
        this.title = title;
        this.author = author;
    }

    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
}

А вот и мой клиент Feign:

package io.urig.checkout;

import java.util.Optional;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import io.urig.checkout.Book;

@FeignClient(name = "inventory", url = "http://localhost:8080/")
public interface InventoryClient {

    @RequestMapping(method = RequestMethod.GET, value = "books/{bookId}")
    public Optional<Book> getBookById(@PathVariable(value = "bookId") Long bookId);

}

Что мне нужно сделать, чтобы это сработало?

2
0
9 887
4

Ответы 4

Я не знаю Feign, но когда у меня в прошлом возникали ошибки «не найдено подходящего HttpMessageConverter ...», это потому, что тип контента не был зарегистрирован. Возможно, вам нужно добавить это в RequestMapping:

consumes = "application/json"

Все, что я могу предложить, - это попытаться подтвердить, зарегистрирован ли в конфигурации Feign MappingJackson2HttpMessageConverter как конвертер для Book. Не уверен, что это должно работать из коробки с Feign, или вам придется делать это вручную. Я вижу пример на GitHub Feign, в котором есть:

GitHub github = Feign.builder()
                 .encoder(new JacksonEncoder())
                 .decoder(new JacksonDecoder())
                 .target(GitHub.class, "https://api.github.com");

Вы создавали конфигурацию с помощью Feign.builder () или других эквивалентных файлов конфигурации?

Спасибо, но, к сожалению, это не сработало. Выдает такое же сообщение об ошибке.

urig 09.03.2018 16:00

Думаю, ваша проблема в типе ответа. Попробуйте преобразовать его в «Книгу» из «Необязательно». Если вы хотите вернуть Optional, вы должны предоставить свой собственный конвертер.

Спасибо. Я перешел с Optional<Book> на Book и получил ту же ошибку.

urig 09.03.2018 20:04

Привет, Уриг! ​​Как ты решил эту проблему или она все еще остается?

NobesInd 17.07.2020 16:09

Вам нужно будет убедиться, что у вас есть хотя бы одна библиотека JSON в вашем пути к классам. Feign поддерживает как GSON, так и Jackson, а Spring Cloud OpenFeign автоматически настроит экземпляры SpringEncoder и SpringDecoder с соответствующим MessageConverter, если они найдены в вашем пути к классам. Убедитесь, что у вас есть хотя бы один из следующих в вашем pom.xml или build.gradle

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.4</version>
</dependency>

или же

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.2</version>
</dependency>

Как только они будут найдены, Spring зарегистрирует соответствующий MessageConverter.

Спасибо. Я не знаю, какой из них работает. Я пошел довольно просто, основываясь на этом примере: cloud.spring.io/spring-cloud-netflix/multi/…. Кроме того, переход с Optional<Book> на Book по-прежнему дает ошибку.

urig 09.03.2018 20:06

Я изменил формулировку своего сообщения, чтобы попытаться ответить.

Kevin Davis 09.03.2018 23:24

Привет, Кевин. Спасибо за вашу помощь! Извините за несколько критические отзывы, которые вы иногда получаете, когда начинаете здесь, в SO. Оказывается, моя проблема заключалась в неисправной зависимости Maven, и удаление ее в папке .m2 прояснило ситуацию. Не было необходимости добавлять явные зависимости от библиотек JSON в pom.xml. По крайней мере, один из них входит в состав самого Feign, я считаю, что это GSON.

urig 10.03.2018 09:31

Спасибо всем, кто пытался помочь!

Как оказалось, моя проблема заключалась в неисправной зависимости Maven, вероятно, поврежденной во время загрузки или установки. После полного удаления папки .m2/repository на моем компьютере и последующего обновления зависимостей Maven для проекта проблема исчезла.

Другие вопросы по теме