Обработка общих слушателей событий во фрагментах репозитория Spring - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть этот интерфейс фрагмента репозитория:

interface EntityEventObserver<T> {

    void addCreatedListener(Consumer<CreatedEvent<T>> listener);
}

и реализация:

class EntityEventObserverImpl<T> implements EntityEventObserver<T> {

    @Override
    public void addCreatedListener(Listener listener) { /* ... */ }

    @EventListener
    public void onCreated(CreatedEvent<T> event) { /* ... */ }
}

Событие определено как:

class CreateEvent<T> extends ApplicationEvent implements ResolvableTypeProvider {

    final T entity;

    public CreatedEvent(T entity) {
        super(entity);
        this.entity = entity;
    }


    @Override
    public ResolvableType getResolvableType() {
        return ResolvableType.forClassWithGenerics(this.getClass(), ResolvableType.forInstance(this.entity));
    }
}

Наконец, репозитории:

interface FooRepository extends JpaRepository<Foo, Long>, EntityEventObserver<Foo> {}

interface BarRepository extends JpaRepository<Bar, Long>, EntityEventObserver<Bar> {}

A CreatedEvent публикуется как eventPublisher.publishEvent(new CreatedEvent<>(entity)) всякий раз, когда создается объект.

С этими типами я бы ожидал, что будет вызван

fooRepository.addCreatedListener(event -> /* ... */);

только для событий CreatedEvent<Foo>, но вызывается также для событий CreatedEvent<Bar>.

Чего мне не хватает?Как я могу заставить вызывать только правильных слушателей?Магия SpEL?

...