#java #spring #graphql
Вопрос:
У меня возникли некоторые проблемы с отображением ответа 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
объект с нулем. Я не уверен, правильна ли иерархия в моем классе ответов или мне следует переместить коллекцию на шаг вниз?
Комментарии:
1. пожалуйста, не используйте
block
для получения значения от издателя, подобного этому. вы мгновенно превратили свое приложение в более не реагирующее, так что вы можете просто написать его процедурно.2. Спасибо за совет!
Ответ №1:
Я думаю, что проблема возникает из-за использования верхнего регистра Area
в ответе. По умолчанию Джексон попытается сопоставить все содержимое с версией имени класса в нижнем регистре (или в нижнем регистре).
Один из способов исправить это:
@JsonProperty("Area")
private Collection<Area> Area;
P.S. вложенные/ внутренние классы могут быть статическими, поэтому public static class AreaData
и т. Д.