У меня есть этот интерфейс фрагмента репозитория:
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?