You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus REST Client示例报错求助:JSON解析相关问题

解决Quarkus REST Client的JSON解析与字段匹配问题

看起来你碰到了两个典型的REST Client配置问题,咱们一步步来搞定:

1. 依赖版本不匹配的问题

你添加的quarkus-resteasy-jackson用了1.3.0.Alpha2版本,但你的Quarkus环境是1.2.1,版本不一致很容易导致兼容性问题(比如Jackson版本不匹配)。

修复方式:
移除依赖中的<version>标签,让Quarkus的BOM自动管理依赖版本,保证和你的Quarkus版本一致:

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-resteasy-jackson</artifactId>
</dependency>

这样会自动拉取和1.2.1匹配的Jackson相关依赖,避免版本冲突。

2. Jackson反序列化未知字段的问题

第二个错误提示Unrecognized field "topLevelDomain",说明你调用的API返回的JSON里包含了topLevelDomain字段,但你的org.acme.Country类里没有定义这个属性,Jackson默认会报错。

有两种修复方案,选一个适合你的:

方案A:忽略所有未知字段(推荐快速解决)

在你的Country类上添加Jackson的@JsonIgnoreProperties注解,告诉Jackson忽略任何类中未定义的字段:

package org.acme;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import java.util.Set;

@JsonIgnoreProperties(ignoreUnknown = true)
public class Country {
    private String name;
    private String alpha2Code;
    private String capital;
    private Set<Currency> currencies;

    // 别忘了添加所有属性的getter和setter
    // ...
}

如果你的Currency类也存在类似的未知字段问题,同样给它加上这个注解。

方案B:添加缺失的字段

如果你需要使用topLevelDomain这个字段的值,直接在Country类里添加对应的属性和getter/setter。注意API返回的topLevelDomain是一个字符串数组,所以用List<String>类型:

package org.acme;

import java.util.List;
import java.util.Set;

public class Country {
    private String name;
    private String alpha2Code;
    private String capital;
    private Set<Currency> currencies;
    private List<String> topLevelDomain;

    // 添加topLevelDomain的getter和setter
    public List<String> getTopLevelDomain() {
        return topLevelDomain;
    }

    public void setTopLevelDomain(List<String> topLevelDomain) {
        this.topLevelDomain = topLevelDomain;
    }

    // 其他属性的getter/setter
    // ...
}

额外检查点

最后确认你的REST Client接口定义是否正确,比如返回类型是不是Set<Country>(而不是 raw 的Set):

import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import java.util.Set;

@RegisterRestClient(baseUri = "https://restcountries.eu/rest/v2")
public interface CountryService {
    @GET
    @Path("/name/{name}")
    Set<Country> getByName(@PathParam("name") String name);
}

泛型缺失也可能导致第一个错误里的MessageBodyReader找不到的问题。

按照上面的步骤调整后,重新启动应用,访问http://localhost:8080/country/name/greece应该就能正常返回结果了。

内容的提问来源于stack exchange,提问作者Zbyslaw Railerski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:52:46