我正在尝试让Spring Cloud Netflix Feign客户端通过HTTP获取一些JSON并将其转换为对象。我不断收到此错误:
org.springframework.web.client.RestClientException:无法提取响应:没有为响应类型[类io.urig.checkout.Book]找到合适的HttpMessageConverter,内容类型[application / json; charset = UTF-8] < / p>
这是从远程服务返回的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);
}
我需要做些什么才能让它发挥作用?
答案 0 :(得分:2)
我不知道Feign,但是当我过去“没有找到合适的HttpMessageConverter ...”错误时,这是因为内容类型尚未注册。也许你需要将它添加到RequestMapping:
consumes = "application/json"
我所能建议的是尝试确认Feign配置是否将MappingJackson2HttpMessageConverter注册为Book的转换器。不确定这是否应该与Feign开箱即用,或者你必须手动完成。我在Feign的GitHub上看到一个例子:
GitHub github = Feign.builder()
.encoder(new JacksonEncoder())
.decoder(new JacksonDecoder())
.target(GitHub.class, "https://api.github.com");
您是否使用Feign.builder()或一些等效的配置文件创建了配置?
答案 1 :(得分:1)
我认为您的问题是响应类型。尝试将其转换为Book from Optional。如果您想要返回一个Optional,那么您应该提供自定义转换器。
答案 2 :(得分:0)
感谢所有试图提供帮助的人!
事实证明我的问题是有缺陷的Maven依赖,可能在下载或安装过程中损坏了。完全删除了我的机器上的.m2/repository
文件夹,然后更新了项目的Maven依赖项,问题现在已经消失。
答案 3 :(得分:-1)
您需要确保类路径上至少有一个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>
或
MessageConverter
一旦找到它们,Spring将注册相应的C:\opscode\chefdk\embedded\git\usr\bin