Я пытаюсь заставить клиента Весеннее облако 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);
}
Что мне нужно сделать, чтобы это сработало?
Я не знаю 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 () или других эквивалентных файлов конфигурации?
Думаю, ваша проблема в типе ответа. Попробуйте преобразовать его в «Книгу» из «Необязательно». Если вы хотите вернуть Optional, вы должны предоставить свой собственный конвертер.
Спасибо. Я перешел с Optional<Book> на Book и получил ту же ошибку.
Привет, Уриг! Как ты решил эту проблему или она все еще остается?
Вам нужно будет убедиться, что у вас есть хотя бы одна библиотека 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 по-прежнему дает ошибку.
Я изменил формулировку своего сообщения, чтобы попытаться ответить.
Привет, Кевин. Спасибо за вашу помощь! Извините за несколько критические отзывы, которые вы иногда получаете, когда начинаете здесь, в SO. Оказывается, моя проблема заключалась в неисправной зависимости Maven, и удаление ее в папке .m2 прояснило ситуацию. Не было необходимости добавлять явные зависимости от библиотек JSON в pom.xml. По крайней мере, один из них входит в состав самого Feign, я считаю, что это GSON.
Спасибо всем, кто пытался помочь!
Как оказалось, моя проблема заключалась в неисправной зависимости Maven, вероятно, поврежденной во время загрузки или установки. После полного удаления папки .m2/repository на моем компьютере и последующего обновления зависимостей Maven для проекта проблема исчезла.
Спасибо, но, к сожалению, это не сработало. Выдает такое же сообщение об ошибке.