Java 如何在MeshRestClient中发送JsonObject请求并接收NodeResponse?

Java 如何在MeshRestClient中发送JsonObject请求并接收NodeResponse?,java,reflection,gentics-mesh,Java,Reflection,Gentics Mesh,在我的Gentics Mesh插件中,我从json文件创建节点 我创建了一个脚本过程,用实际值(例如,来自上一个节点创建事件)替换json文件中的变量占位符 如果我有一个强类型对象添加到变量解析器中,这将非常有用 因为变量解析器使用反射来查找变量值上的属性名,并在json中进行替换。 但是,如果添加到解析器的变量是JsonObject,则我需要的属性不可用 示例: 我在解析器中根据这个方法的输出设置了一个名为“project”的变量。[projectResponse.rootNode] priv

在我的Gentics Mesh插件中,我从json文件创建节点

我创建了一个脚本过程,用实际值(例如,来自上一个节点创建事件)替换json文件中的变量占位符

如果我有一个强类型对象添加到变量解析器中,这将非常有用

因为变量解析器使用反射来查找变量值上的属性名,并在json中进行替换。 但是,如果添加到解析器的变量是JsonObject,则我需要的属性不可用

示例:

我在解析器中根据这个方法的输出设置了一个名为“project”的变量。[projectResponse.rootNode]

private ProjectResponse createProject(String project) {
    ProjectCreateRequest createProject = new ProjectCreateRequest()
            .setName(project)
            .setSchemaRef("folder");
    return this.adminClient.createProject(createProject).blockingGet();
}
Json文件-

第一个json文件可以工作,因为我将项目节点引用添加到变量解析器-

{
  "parentNode" : {
    "uuid" : "<project.uuid>"
  },
  "schema" : {
    "name" : "folder"
  },
  "language" : "en",
  "fields" : {
    "name" : "node1 - child of project root node"
  }
}
第二个json文件不起作用,因为node1是一个JsonObject,并且没有uuid属性-

{
  "parentNode" : {
    "uuid" : "<node1.uuid>"
  },
  "schema" : {
    "name" : "folder"
  },
  "language" : "en",
  "fields" : {
    "name" : "node2 - child of node1"
  }
}
原因:com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造com.gentics.mesh.core.rest.node.FieldMapno创建者,如默认构造,存在:抽象类型需要映射到具体类型,具有自定义反序列化器,或包含其他类型信息 通过引用链在[Source:UNKNOWN;line:-1,column:-1]处:com.gentics.mesh.core.rest.node.NodeResponse[fields]


我想我已经解决了一个类似的用例,在另一个类中包装了一个映射,然后当反射发生时,我根据映射中的键返回我自己的属性值。。。但那是。。。很久以前。

证明我使用的模板引擎可以处理地图对象,并像访问属性一样访问密钥。 我通过将JsonObject转换为HashMap修复了它

return response.mapTo(HashMap.class);

如果您有一个JSON字符串,那么可以使用JsonUtilreadValue将其转换为任何类。我认为,如果您使用的是Mesh Rest客户端,那么应该公开这一点。因此,对于您的请求,可以使用JsonUtil.readValuejson、NodeCreateRequest.class

如果您仍然想使用泛型方法,我认为最好的方法是将JsonObject转换为字符串,然后使用readValue方法

private NodeResponse createNode(String project, String processedNode) {
        JsonObject request = new JsonObject(processedNode);
        JsonObject response = this.adminClient.post(String.format("/%s/nodes", project), request).blockingGet();
        return response.mapTo(NodeResponse.class);
}
return response.mapTo(HashMap.class);