【问题标题】:Using the Alias annotation when reading the managed objects读取托管对象时使用别名注释
【发布时间】:2018-07-30 19:45:32
【问题描述】:

我想用一些自定义片段来扩展托管对象。像这样的:

@Alias(value = "Dictionary")
public class Dictionary extends AbstractDynamicProperties {
    private Map<String, String> records = new HashMap<>();

    @JSONProperty(ignoreIfNull = false)
    public Map<String, String> getRecords() { return this.records; }

    (...)
}

当我创建一个新的托管对象并将其保存到库存 API 中时,一切看起来都很棒:

ManagedObjectRepresentation dictionary = new ManagedObjectRepresentation();
dictionary.setName(dictionaryName);
dictionary.set(new Dictionary());

不幸的是,当我获取这个托管对象并想要检索 Dictionary 类时,我收到了一个 HashMap:

dictionary.get(Dictionary.class).addRecord(key, value);

经过一些调试,我发现保存托管对象时,ExtensibilityConverter(tryGetAlias() 第 98 行)正在遍历对象中的所有注解,如果找到 Alias 注释,它从那里获取值。

另一方面,当 Cumulocity 的响应被反序列化时,Svenson 正在使用 AliasMapClassFinder,我只能在 ExtensibilityConverter 中看到初始化。我无法发现这张地图 alias2ClassName 已被填充的任何地方,因为它总是空的,所以我收到的是 HashMap 而不是我期望的类。

我错过了什么吗?或者这是 SDK 中的错误?

【问题讨论】:

    标签: java cumulocity


    【解决方案1】:

    我不确定您要对别名注释做什么。我假设您只是想在 Java 应用程序中管理自定义片段。

    创建自定义片段并以类型安全的方式处理它的最简单方法是简单地创建一个类似于您的片段的类。

    假设您要管理以下片段:

    {
        "my_custom_Fragment":{
            "stringProperty": "hello world",
            "numericProperty": 1337
        }
    }
    

    然后你创建这个类来模仿它:

    package my.custom;
    
    public class Fragment {
        private String stringProperty;
        private int numericProperty;
    
        //constructors, getters, setters
    }
    

    如果你想支持动态属性,也可以像你的例子一样扩展AbstractDynamicProperties

    将点替换为下划线的完全限定类名将在您将其分配给托管对象时成为片段名称(在我们的示例中为 my_custom_Fragment)。

    ManagedObjectRepresentation managedObject = new ManagedObjectRepresentation();
    Fragment fragment = new Fragment();
    //set fragment properties
    managedObject.set(fragment);
    

    您也可以以类型安全的方式从托管对象中检索片段。

    ManagedObjectRepresentation created = inventoryApi.create(managedObject);
    Fragment createdFragment = created.get(Fragment.class);
    

    【讨论】:

    • 嗨,这正是我开始做的。我想用@alias 注释完成的是在模块中找到一个类:my.custom.model.Fragment 但要使用片段“my_custom_Fragment”,正如我所说,当我保存 mo 时就可以了。阅读不起作用,斯文森没有找到自定义类。
    猜你喜欢
    • 1970-01-01
    • 2014-09-27
    • 2016-09-01
    • 2013-07-19
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多