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