我正在尝试集成(创建完美的数据通信)基于Java的后端和第三方GraphQL API。
我发现类似的问题部分回答了我的问题。 How to access the GitHub GraphQL API?
我在搜索引擎上搜索的所有请求或在Github上找到的代码段都与如何在服务器端创建GraphQL API有关,因此我的后端将具有GraphQL包装器/端点。对我来说不是这种情况。
以下是一个问题,如果有包装器,我可以使用这些注释来简化POJO中query
和mutation
的生物。我想要它的原因,而不是创建硬编码的字符串,我的对象可以是动态的,并且包含,排除字段。对于突变和查询,我都需要任何示例。自然,我不想创建很多自定义解析器。
答案 0 :(得分:0)
由于在编写代码期间,我找不到任何答案或具有足够大量文档的库。我创建了自己的包装器,用于将POJO包装到mutation
和query
中。
此实现可能不适用于所有GraphQL API。因此,重要的是,此实现是专门为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包装器以请求参数
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
字段。 / p>
nvl
也是一种实用函数,用于用默认值替换null
个对象。