在AEM 6中从Java查找云服务配置的“正确”方法

Dav*_*d J 5 java aem

AEM的Cloud Services API的文档记录得并不完善,并且提供了许多使用尴尬的方法,这些方法可用于Configuration从资源中查找给定的给定值。以下是一些我在野外发现的示例,可以做到这一点。

方法1:全部获取Configurations并迭代它们,直到找到命名的配置:

public static Configuration findConfiguration(ConfigurationManager configurationManager, Resource resource, String serviceName) {
    Iterator configurations = configurationManager.getConfigurations(resource);
    while (configurations.hasNext()) {
        Configuration configuration = (Configuration) configurations.next();
        if (serviceName.equals(configuration.get("cq:cloudservicename", ""))) {
            return configuration;
        }
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

方法2:查找cq:cloudserviceconfigs适用于该资源的所有资源,并索取所需的资源:

public static Configuration findConfiguration(ConfigurationManager configurationManager, Resource resource, String serviceName) {
    HierarchyNodeInheritanceValueMap pageProperties = 
        new HierarchyNodeInheritanceValueMap(resource);

    String[] allServices = 
        pageProperties.getInherited("cq:cloudserviceconfigs", new String[0]);

    return configurationManager.getConfiguration(serviceName, allServices);
}
Run Code Online (Sandbox Code Playgroud)

方法3:与方法2相似,但是看起来只有在具有cq:cloudserviceconfigs属性的第一个父对象上也定义了所请求的配置时,它才会起作用?

public static Configuration findConfiguration(ConfigurationManager configurationManager, Resource resource, String serviceName) {

    Resource configurationResource = 
        configurationManager.getConfigurationResource(resource);

    if (configurationResource != null) {
        String[] cloudServiceConfigs = configurationResource.adaptTo(Page.class)
            .getProperties().get("cq:cloudserviceconfigs", String[].class);

        if (cloudServiceConfigs != null && cloudServiceConfigs.length > 0) {
            return configurationManager.getConfiguration(serviceName, cloudServiceConfigs);
        }
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

我发现奇怪的是,无论谁设计了这个界面,都没有简单地添加类似的方法Configuration ConfigurationManager#getService(Resource resource, String serviceName)-您必须跳过以实现看起来像一个普通用例的箍很令人沮丧,但这显然是这样的。

所以我的问题是这样的:

  1. 是否有比ConfigurationManager查找页面或资源的特定云服务配置更好的API或库?

  2. 如果不是,有什么好的,健壮的,高性能的方式ConfigurationManager来做到这一点?

谢谢。