我在映射GraphQL响应到一个类时遇到了一些麻烦,我可能错过了一些明显的东西,所以我想我需要另一双眼睛来检查我的代码。
我有一个像这样的响应:
{
"data": {
"Area": [
{
"id": "1"
},
{
"id": "2"
}
]
}
}
我的消费者和客户是这样的:
public class Consumer {
private final WebClient webClient;
private static final String QUERY = "query { Area { id }}";
public Consumer(WebClient webClient) {
this.webClient = webClient;
}
public AreaResponse.AreaData getAreas() {
var request = new GraphQLRequest(QUERY, null);
var res = webClient.post()
.bodyValue(request)
.retrieve()
.bodyToMono(AreaResponse.class)
.block();
return res.getData();
}
}
最后是我的回应dto:
@Data
public class AreaResponse {
private AreaData data;
@Data
public class AreaData{
private Collection<Area> Area;
@Data
public class Area{
private String id;
}
}
}
如果我将响应映射到String.class
,我将获得与Postman相同的数据,因此查询或端点没有任何错误。但是当我尝试映射到AreaResponse
时,Area
对象是空的。我不确定响应类中的层次结构是否正确,或者我是否应该将集合向下移动一步?
我认为问题来自于在响应中使用大写Area
。默认情况下,Jackson将尝试将所有内容映射到类名的小写版本(或小写camelcase)。
修复方法之一:
@JsonProperty("Area")
private Collection<Area> Area;
注:嵌套类/内部类可以是静态的,所以public static class AreaData
等