Я пытаюсь интегрировать (создать безупречный обмен данными) свой сервер на основе Java и сторонний API GraphQL.
Я нашел аналогичный вопрос, который частично отвечает на мой. Как получить доступ к GitHub GraphQL API?
Все запросы, которые я искал в поисковой системе, или фрагменты, которые я нашел на Github, связаны с тем, как создать GraphQL API на стороне сервера, поэтому мой Back-end будет иметь оболочку / конечную точку GraphQL. Для меня это не так.
Вопрос в следующем, есть ли какие-нибудь обертки, аннотации, которые я могу использовать, чтобы упростить создание query и mutation из POJO. Причина, по которой я этого хочу, вместо создания жестко запрограммированных строк мои объекты могут быть динамическими и включать, исключать поля. Мне нужны примеры как для мутаций, так и для запросов. Естественно, я не хочу создавать много настраиваемых преобразователей.





Поскольку за время написания кода я не нашел ни ответа, ни библиотеки с достаточно значительной документацией. Я создал свою собственную оболочку для упаковки POJO в mutation и query.
Эта реализация может работать не для всех API GraphQL. Поэтому важно отметить, что эта реализация была создана специально для интеграции Xledger.
Основная обертка
public String simpleResolver(String operationName, String requestName, Map<String, Object> requestedParams, List<String> requestedFields, String objectNestingStructure) {
String params = nvl(requestedParams).entrySet().stream().map(p -> p.getKey() + ":" + wrapWithQuotes(p.getValue())).collect(joining(","));
String[] obejctNesting = nvl(objectNestingStructure).split("\\.");
String fields = nvl(requestedFields).stream().collect(joining("\n"));
return "{ \"query\":\"" + operationName + "{\n" + requestName + "(" + params + ") {\n" + buildObjectNestingStructure(obejctNesting, fields) + "}\n}\n\"," +
"\"variables\":" + null + "," +
"\"operationName\":" + null + "}";
}
Парсер и оболочка для вложенной структуры типа GraphQL
public String buildObjectNestingStructure(String[] objectNestingStructure, String fields) {
StringBuilder objectHead = new StringBuilder();
StringBuilder objectTail = new StringBuilder();
for (String objectNesting : objectNestingStructure) {
objectHead.append(objectNesting);
objectHead.append(" {\n");
objectTail.append("\n}");
}
objectHead.append(fields);
objectHead.append(objectTail);
return objectHead.toString();
}
Обертка POJO для requestParams
public <T> Map<String, Object> getParams(T entity) {
Map<String, Object> params = new HashMap<String, Object>();
Class<?> cls = entity.getClass();
for (Field field : cls.getDeclaredFields()) {
try {
String fieldName = field.getName();
Object fieldValue = field.get(entity);
if (fieldValue != null) {
params.put(fieldName, fieldValue);
}
} catch(IllegalArgumentException | IllegalAccessException e) {
logger.error(e.getMessage());
}
}
return params;
}
Это решение работает как для query, так и для mutation, поскольку у обоих есть param, и в моем случае я всегда брал, по крайней мере, поле dbId.
Также nvl - служебная функция для замены объектов null на значение по умолчанию.