Как получить доступ к c8y_PropertyType (пользовательские атрибуты) в Java SDK? - PullRequest
0 голосов
/ 29 июня 2018

Я использую Java-пакет Cumulocity и пытаюсь получить доступ к пользовательскому фрагменту в одном из ManagedObject. Примерно так:

...
"type": "sap_CustomomerLocation",
"c8y_PropertyType":{
    "Customer.Name":{ 
        "name":"customerName", 
        "sap_field_name":{
            "requestIdentifier":"SAP",
            "adressIdentifier":"customerName" 
        }
    },
    "Customer.Address":{ 
        "name":"customerAddress", 
        "sap_field_name":{
            "requestIdentifier":"SAP",
            "adressIdentifier":"customerAddress" 
        }
    }
}
...

Я не могу изменить формат фрагмента. В приложении Java я получаю Мо по:

InventoryFilter filter = new InventoryFilter();
filter.byType("sap_CustomomerLocation");

ManagedObjectCollection configuration = platform.getInventoryApi().getManagedObjectsByFilter(filter);
ManagedObjectRepresentation singleConfig = configuration.get().allPages().iterator().next();

Map<String, Object> attrs = singleConfig.getAttrs();

Проблема в том, что я не могу добраться до "sap_field_name", attrs - это HashMap @ Node. В отладчике в IntelliJ, когда я использую «defineExpression», генерируется что-то подобное:

((HashMap.Node)((HashMap)((HashMap.Node)((HashMap)((HashMap.Node)((HashMap)((HashMap.Node)((HashMap)attrs).entrySet().toArray()[0]).getValue()).entrySet().toArray()[0]).getValue()).entrySet().toArray()[0]).getValue()).entrySet().toArray()[1]).getValue()

Итак, вы можете что-то предложить? Должен ли я как-то привести его в DTO? Но как обработать ключи в JSON («Customer.Name», «Customer.Address»), которые могут измениться, потому что это список полей.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Я пытался создать новый класс в пространстве имен c8y.PropertyType, и он вроде работал, Cumulocity SDK, точнее, Джексон JSON основал существование класса и попытался отобразить его, но проблема остается с точки зрения динамических полей.

После небольшой отладки в коде Джексона я обнаружил, что мне нужно создать класс в правильном пространстве имен для всех настраиваемых полей (к сожалению, я не знаю имен).

Так что это обходной путь, который я нашел приемлемым:

ManagedObjectRepresentation singleConfig;

Map<String, Object> attrs = singleConfig.getAttrs();
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.valueToTree(attrs);

String customFieldName = jsonNode.get("c8y_PropertyType").get("attrs").iterator().next().get("sap_field_name").get("adressIdentifier").asText();
0 голосов
/ 29 июня 2018

Один из способов сделать это - создать класс модели для вашего фрагмента c8y_PropertyType, соответствующий содержимому. Чтобы отобразить этот фрагмент, вам нужно создать класс PropertyType в пакете c8y и поместить его в путь к классу.

Парсер JSON больше не должен генерировать эту структуру HashMap, а ваш класс. Я не совсем уверен, если точки в ключах JSON приводят к проблемам здесь.

Если вам нужны примеры для таких классов, отметьте https://bitbucket.org/m2m/cumulocity-clients-java/src/03e47693b1d389308901347d224c13d81250b703/device-capability-model/?at=develop

...