【问题标题】:How to access c8y_PropertyType (custom attributes) in Java SDK?如何在 Java SDK 中访问 c​​8y_PropertyType(自定义属性)?
【发布时间】:2018-07-02 20:53:20
【问题描述】:

我正在使用 Cumulocity Java SDK,并尝试访问其中一个 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 应用程序中,我通过以下方式获取 Mo:

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 的调试器中,当我使用“evaluateExpression”时,会生成类似的东西:

((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”),因为这是一个字段列表。

【问题讨论】:

    标签: java sdk cumulocity


    【解决方案1】:

    我尝试在命名空间 c8y.PropertyType 中创建一个新类,它有点工作,Cumulocity SDK,或者更确切地说是 Jackson JSON 发现有一个类并尝试映射它,但问题仍然在于这个动态字段。

    在对 Jackson 代码进行小调试后,我发现我需要在正确的命名空间中为所有自定义字段创建一个类(不幸的是我不知道名称)。

    所以这是我认为可以接受的解决方法:

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

    【讨论】:

    • 请告诉我你的主要目标是什么,你想要哪些碎片数据
    • 我需要获取所有“name”和“adressIdentifier”字段。
    【解决方案2】:

    您可以采用的一种方法是为您的 c8y_PropertyType 片段创建一个与内容匹配的模型类。要映射此片段,您需要在包 c8y 中创建一个类 PropertyType 并将其放在类路径中。

    JSON 解析器应该不再生成这个 HashMap 结构,而是生成你的类。我不确定 JSON 键中的点是否会导致这里出现问题。

    如果您需要此类课程的示例,请查看https://bitbucket.org/m2m/cumulocity-clients-java/src/03e47693b1d389308901347d224c13d81250b703/device-capability-model/?at=develop

    【讨论】:

      猜你喜欢
      • 2015-09-28
      • 2016-12-07
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      相关资源
      最近更新 更多