Как я могу отправить запрос JsonObject и получить NodeResponse в MeshRestClient? - PullRequest
0 голосов
/ 21 октября 2019

В моем плагине Gentics Mesh я создаю узлы из файлов json.

Я создал процесс создания сценариев, который заменяет переменные заполнители в файле json фактическими значениями [например, из предыдущего события создания узла].

Это прекрасно работает, если у меня естьстрого типизированный объект добавлен в переменную resolver ...

Поскольку преобразователь переменной использует отражение для поиска имен свойств в значении переменной и выполняет замену в 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 работает, потому что я добавил NodeReference проекта в преобразователь переменных -

{
  "parentNode" : {
    "uuid" : "<project.uuid>"
  },
  "schema" : {
    "name" : "folder"
  },
  "language" : "en",
  "fields" : {
    "name" : "node1 - child of project root node"
  }
}

Ответэто создание - JsonObject, который я затем передаю в преобразователь переменных.
Затем я создаю второй узел.
Примечание Я использую универсальный метод post [я не знаю, каксоздать NodeCreateRequest из строки json, что также могло бы решить эту проблему]

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

Второй файл json не работает, поскольку node1 является JsonObject и не имеет свойства uuid -

{
  "parentNode" : {
    "uuid" : "<node1.uuid>"
  },
  "schema" : {
    "name" : "folder"
  },
  "language" : "en",
  "fields" : {
    "name" : "node2 - child of node1"
  }
}

Я не могу автоматически сопоставить JsonObject с NodeResponse - а FieldMap имеет много разных реализаций, поэтому я не знаю, смогу ли я добавить модуль Mapper, чтобы это исправить.

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);
}

Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.gentics.mesh.core.rest.node.FieldMap (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: com.gentics.mesh.core.rest.node.NodeResponse["fields"])

Я думаю, что я решил аналогичный вариант использования, поместив карту в другой класс, а затем при отражениипроисходит, я возвращаю свои собственные значения свойств basна клавишах карты ... но это был C # ... и давным-давно.

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Если у вас есть строка JSON, вы можете преобразовать ее в любой класс, используя JsonUtil # readValue. Я думаю, что это должно быть открыто, если вы используете Mesh Rest Client. Так что в вашем случае для запроса вы можете использовать JsonUtil.readValue(json, NodeCreateRequest.class).

Если вы все еще хотите использовать универсальные методы, я считаю, что лучший способ - преобразовать JsonObject в String и затем использовать метод readValue.

0 голосов
/ 21 октября 2019

Оказывается, что используемый мной шаблонизатор может обрабатывать объект Map и обращаться к ключу как к свойству.
Я исправил это, преобразовав JsonObject в HashMap.

return response.mapTo(HashMap.class);
...