首页 > 解决方案 > ServiceTrackerCustomizer 服务引用返回 null

问题描述

我有一个包含 Product 实体的持久性捆绑包。由于我想在我的 Solr 服务器上按需触发更新,所以当我更改实例时,我引入了一个实体侦听器:

@Entity
public class Product {
    // id and fields

    @PrePersist
    public void onPersist () {
        ProductAudit.onPersist( this );
    }

    // other lifecycle callbacks
}

public class ProductAudit {
    private static final Set<ProductListener> listeners = new HashSet<>();

    // static addListener/removeListener

    public void onPersist (Product p) {
        listeners.forEach(l -> {
            l.onPersist(p);
        }
    }
}

为了将我的持久性单元集成到我的 OSGi 环境中,我编写了一个利用服务跟踪器的适配器包:

@Component(
    name="com.acme.product.audit",
    immediate=true)
public class OsgiProductListener implements ProductListener {
    private ServiceTracker<ProductListener,ProductListener> tracker;

    @Activate
    public void activate (BundleContext context) {
        tracker = new ServiceTracker<>(context, ProductListener.class, new ServiceTrackerCustomizer<ProductListener, ProductListener>() {

            @Override
            public ProductListener addingService(ServiceReference<ProductListener> reference) {
                if (validProps(reference)) {
                    ProductListener l = reference.getBundle().getBundleContext().getService(reference); // null
                    ProductListener l = context.getService(reference); // null too
                    System.out.println("Adding " + l);
                    ProductAudit.addListener(l);
                    return l;
                }

                return null;
            }

            // modifiedService, removedService

            private boolean validProps(ServiceReference<?> reference) {
                // check for enabling flag
            }
        });

        tracker.open();
    }

现在我有两个提供程序包——一个测试包和一个索引器包。当我部署两者时,在控制台上打印:

 > Activating com.acme.persistence.audit component
  ...
 > Adding com.acme.persistence.test.ProductListenerImpl@1337
 > Adding null

所有三个捆绑包都使用相同的 API 版本,否则我的跟踪器不会跟踪它们。

那么,如果我尝试获取 ProductListener 服务,为什么我会得到 null 呢?

标签: osgi

解决方案


推荐阅读