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

