Так как я не нашел ни одного ответа или библиотеки с достаточно значительной документацией во время написания кода.Я создал свою собственную оболочку для упаковки 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
объектов значением по умолчанию.