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

7hiiyaii  于 2022-09-18  发布在  Spring
关注(0)|答案(6)|浏览(496)

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

}

我需要做些什么才能让它正常工作?

xxls0lw8

xxls0lw81#

我不知道假动作,但当我遇到“没有找到合适的HttpMessageConverter...”过去的错误,是因为内容类型没有注册。也许您需要将以下内容添加到RequestMap中:

consumes = "application/json"

我所能建议的是尝试确认Feign配置是否已将MappingJackson2HttpMessageConverter注册为Book的转换器。我不确定这是一种开箱即用的方式,还是必须手动完成。我在Feign的GitHub上看到了一个例子,它有:

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

您是否使用Feign.Builder()或某些等效的配置文件创建了配置?

qojgxg4l

qojgxg4l2#

您需要确保类路径上至少有一个JSON库。Feign同时支持GSONJackson,并且Spring Cloud OpenFeign将使用适当的MessageConverter自动配置SpringEncoderSpringDecoder示例(如果在您的类路径中找到它们)。确保您的pom.xmlbuild.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

8ehkhllq

8ehkhllq3#

我认为你的问题在于回应的类型。尝试将其从可选转换为图书。如果您想返回一个可选的,那么您应该提供您的自定义转换器。

a9wyjsp7

a9wyjsp74#

抱歉,回答得太晚了。

也有同样的问题。

只需将两个参数添加到您的@Requestmap-

consumes = "application/json", produces = "application/json"

在您的代码中,这将如下所示-

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}", consumes = "application/json", produces = "application/json")
public Optional<Book> getBookById(@PathVariable(value="bookId") Long bookId);

}
jhiyze9q

jhiyze9q5#

感谢所有试图帮助我们的人!

事实证明,我的问题是有缺陷的Maven依赖项,可能在下载或安装过程中已损坏。在完全删除了我机器上的.m2/repository文件夹,然后更新了项目的Maven依赖关系之后,这个问题现在就解决了。

i7uaboj4

i7uaboj46#

我来晚了,但我想再补充一点。在我的例子中,我观察到当您将返回类型指定为特定的模型/实体类并且找不到该实体时,Spring Feign客户端返回此异常。

您应该检查您正在调用的另一个服务的响应,并查看它在找不到实体或抛出异常的情况下返回什么响应。

因此,如果找不到实体或抛出任何异常,并且该响应与您在返回类型中指定的值不匹配,则在客户端服务中抛出此异常。

相关问题