我正在尝试让Spring Cloud Netflix Feign客户端通过HTTP获取一些JSON并将其转换为对象。相反,我一直收到这样的错误:
Org.springframework.web.client.RestClientException:无法提取响应:找不到适用于响应类型[类io.urig.check out.Book]和内容类型[应用程序/json;字符集=utf-8]的HttpMessageConverter
下面是从远程服务返回的一小段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;
}
}
这是我的假客户:
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);
}
我需要做些什么才能让它正常工作?
6条答案
按热度按时间xxls0lw81#
我不知道假动作,但当我遇到“没有找到合适的HttpMessageConverter...”过去的错误,是因为内容类型没有注册。也许您需要将以下内容添加到RequestMap中:
我所能建议的是尝试确认Feign配置是否已将MappingJackson2HttpMessageConverter注册为Book的转换器。我不确定这是一种开箱即用的方式,还是必须手动完成。我在Feign的GitHub上看到了一个例子,它有:
您是否使用Feign.Builder()或某些等效的配置文件创建了配置?
qojgxg4l2#
您需要确保类路径上至少有一个JSON库。Feign同时支持
GSON
和Jackson
,并且Spring Cloud OpenFeign
将使用适当的MessageConverter
自动配置SpringEncoder
和SpringDecoder
示例(如果在您的类路径中找到它们)。确保您的pom.xml
或build.gradle
中至少有以下一项或
一旦找到它们,Spring将注册适当的
MessageConverter
8ehkhllq3#
我认为你的问题在于回应的类型。尝试将其从可选转换为图书。如果您想返回一个可选的,那么您应该提供您的自定义转换器。
a9wyjsp74#
抱歉,回答得太晚了。
也有同样的问题。
只需将两个参数添加到您的@Requestmap-
在您的代码中,这将如下所示-
jhiyze9q5#
感谢所有试图帮助我们的人!
事实证明,我的问题是有缺陷的Maven依赖项,可能在下载或安装过程中已损坏。在完全删除了我机器上的
.m2/repository
文件夹,然后更新了项目的Maven依赖关系之后,这个问题现在就解决了。i7uaboj46#
我来晚了,但我想再补充一点。在我的例子中,我观察到当您将返回类型指定为特定的模型/实体类并且找不到该实体时,Spring Feign客户端返回此异常。
您应该检查您正在调用的另一个服务的响应,并查看它在找不到实体或抛出异常的情况下返回什么响应。
因此,如果找不到实体或抛出任何异常,并且该响应与您在返回类型中指定的值不匹配,则在客户端服务中抛出此异常。