Ссылка службы ServiceTrackerCustomizer возвращает ноль - PullRequest
0 голосов
/ 10 октября 2018

У меня есть постоянный пакет, содержащий сущность 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...