在AEM中使用getServiceReference检索时,OSGI ConfigurationAdmin为null

在AEM中使用getServiceReference检索时,OSGI ConfigurationAdmin为null,osgi,aem,osgi-bundle,Osgi,Aem,Osgi Bundle,我正在处理一个用例,该用例涉及访问不属于当前捆绑包的其他捆绑包的属性。为了实现这一点,我必须修改当前AEM包(AEM 6.2)的权限。我认为OSGi服务的ConditionalPermissionAdmin是前进的方向 方法参考: 我有下面的代码,打算检索ConditionalPermissionAdmin,但是 某些未知原因导致此值始终为空 public class Activator implements BundleActivator { private static final

我正在处理一个用例,该用例涉及访问不属于当前捆绑包的其他捆绑包的属性。为了实现这一点,我必须修改当前AEM包(AEM 6.2)的权限。我认为OSGi服务的ConditionalPermissionAdmin是前进的方向

方法参考:

我有下面的代码,打算检索ConditionalPermissionAdmin,但是 某些未知原因导致此值始终为空

public class Activator implements BundleActivator {

   private static final Logger LOG = LoggerFactory.getLogger(Activator.class);

   private ConditionalPermissionAdmin conditionalPermissionAdmin;

  @Override
  public final void start(final BundleContext bundleContext) {
    try {
        conditionalPermissionAdmin = getConditionalPermissionAdmin(bundleContext);
        if (conditionalPermissionAdmin != null) {
            LOG.info("{0} conditionalPermissionAdmin ", conditionalPermissionAdmin.getClass());
           /* pseudocode */
        }
        LOG.info("{0} started", bundleContext.getBundle().getSymbolicName());
    }  catch (Exception ex) {
        LOG.error(ex.getMessage());
    }
  }

  private ConditionalPermissionAdmin getConditionalPermissionAdmin(BundleContext context) throws BundleException {
    ServiceReference ref = context.getServiceReference(ConditionalPermissionAdmin.class.getName());
    ConditionalPermissionAdmin permissionAdmin = null;
    if (ref != null) {
        permissionAdmin = (ConditionalPermissionAdmin) context.getService(ref);
    }
    return permissionAdmin;
  }

  @Override
  public final void stop(final BundleContext bundleContext) {
    LOG.info("{0} stopped", bundleContext.getBundle().getSymbolicName());
  }
}

我没有看到任何构建或运行时问题。就连这捆东西也完好无损

这种低级API并不是建议的最佳方法。但我不确定使用声明式服务来获得许可

注意-->我不熟悉OSGi的概念和实现

参考资料:


通常在OSGi中,服务引用可能(尚未)可用。 因此,仅仅获取当前服务引用很可能会因为时间问题而失败

一种有效的低级方法是启动ServiceTracker,并在服务可用时作出反应。但这很难做到正确


因此,正如您已经听说的,使用DS是最好的推荐方法。

通常在OSGi中,服务引用可能(尚未)可用。 因此,仅仅获取当前服务引用很可能会因为时间问题而失败

一种有效的低级方法是启动ServiceTracker,并在服务可用时作出反应。但这很难做到正确


因此,正如您已经听说的那样,使用DS是最好的推荐方法。

尽管我不完全了解该用例以及为什么服务用户或基于用户的访问通常不起作用,但我发现:

建议您需要安装
org.apache.felix.framework.security
捆绑包,默认情况下AEM不会安装该捆绑包(至少看一下我的香草6.3实例)

它列在Felix子项目安装页面的“框架安全”下:


问题是在您的实例中没有OSGI
org.OSGI.service.condpermadmin.ConditionalPermissionAdmin
的实现。这就是为什么您需要felix安全捆绑包。

尽管我不完全理解该用例,也不完全理解为什么服务用户或基于用户的访问通常不起作用,但我发现:

建议您需要安装
org.apache.felix.framework.security
捆绑包,默认情况下AEM不会安装该捆绑包(至少看一下我的香草6.3实例)

它列在Felix子项目安装页面的“框架安全”下:


问题是在您的实例中没有OSGI
org.OSGI.service.condpermadmin.ConditionalPermissionAdmin
的实现。这就是为什么您需要felix安全捆绑包。

1。您使用的是什么AEM版本?2.你能详细说明一下你的用例吗?为什么基于用户的许可不起作用?@AhmedMusallam-我在AEM 6.2上。我已经用用例更新了描述。基于用户的权限不起作用,因为这与内容无关。当你说“访问其他捆绑包的属性”时,你是什么意思?你想访问的是什么?OSGI配置1。您使用的是什么AEM版本?2.你能详细说明一下你的用例吗?为什么基于用户的许可不起作用?@AhmedMusallam-我在AEM 6.2上。我已经用用例更新了描述。基于用户的权限不起作用,因为这与内容无关。当你说“访问其他捆绑包的属性”时,你是什么意思?你想访问的是什么?OSGI配置?太棒了。这起作用了,原因确实与缺少与ConditionalPermissionAdmin相关的实现有关。安装
org.apache.felix.framework.security
bundle就像魔术一样。这在AEM 6.2中也缺失了。太棒了。这起作用了,原因确实与缺少与ConditionalPermissionAdmin相关的实现有关。安装
org.apache.felix.framework.security
bundle就像魔术一样。AEM 6.2中也缺少此功能。因为,此问题与缺少ConditionalPermissionAdmin的实现有关。由于通过安装缺少的
org.apache.felix.framework.security
bundle解决了这一问题,因此我现在可以使用DS实现相同的包。实现ConditionalPermissionAdmin当然是重要的第一步!但是Christian指出的问题仍然存在。。。即使安装了实现,也无法预测或强制执行服务可用的顺序。因此,如果您只是在单个时间点请求该服务,您可能会得到null,因为该服务还不存在。这就是建议使用DS的原因。因为,该问题与缺少ConditionalPermissionAdmin的实现有关。由于通过安装缺少的
org.apache.felix.framework.security
bundle解决了这一问题,因此我现在可以使用DS实现相同的包。实现ConditionalPermissionAdmin当然是重要的第一步!但是Christian指出的问题仍然存在。。。即使安装了实现,也无法预测或强制执行服务可用的顺序。因此,如果您只是在单个时间点请求该服务,您可能会得到null,因为该服务还不存在。这就是为什么建议使用DS。