Spring Feign:无法提取响应:没有为响应类型找到合适的HttpMessageConverter

时间:2018-03-09 14:25:04

标签: spring spring-cloud-feign feign

我正在尝试让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);

}

我需要做些什么才能让它发挥作用?

4 个答案:

答案 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支持GSONJacksonSpring Cloud OpenFeign会自动配置SpringEncoderSpringDecoder个实例,如果在您的类路径中找到MessageConverterpom.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