Отправка событий домена Spring с использованием специального ApplicationEventPublisherJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Отправка событий домена Spring с использованием специального ApplicationEventPublisher

Сообщение Anonymous »

Я пытаюсь реализовать приложение с использованием Spring Boot/Spring Data, следуя рекомендациям по архитектуре DDD. У меня есть совокупный корень, который публикует события домена с помощью метода AbstractAggregateRoot::registerEvent() . Кроме того, мне нужно перехватывать эти события для целей ведения журнала/трассировки, поэтому я решил провести эксперимент:
Сначала реализуйте собственный издатель ApplicationEvent

Код: Выделить всё

public class CustomEventPublisher implements ApplicationEventPublisher {
private final ApplicationEventPublisher publisher;

private final Logger logger = getLogger(CustomEventPublisher.class);

public CustomEventPublisher(ApplicationEventPublisher publisher) {
this.publisher = publisher;
}

@Override
public void publishEvent(ApplicationEvent event) {
logger.info("sending an event...");
publisher.publishEvent(event);
}

//.....
}
И затем регистрация как bean-компонент

Код: Выделить всё

@Configuration
public class CustomEventPublisherConfig {

@Bean
@Primary
public ApplicationEventPublisher getCustomEventPublisher(ApplicationEventPublisher publisher , RabbitTemplate rabbitTemplate) {
return new CustomEventPublisher(publisher, rabbitTemplate);
}
}
это работает нормально, если я явно публикую события из некоторого образца объекта с помощью внедренного ApplicationEventPublisher

Код: Выделить всё

public void pub() {
publisher.publishEvent(new Event(this , 1));
}

@EventListener
public void sub(Event e) {
this.value = e.getValue();
}
и я получил запись в журнале "отправка события..."
затем я попытался определить совокупный корень

Код: Выделить всё

@Entity
public class AggregateRoot extends AbstractAggregateRoot {

@Id
@GeneratedValue
private Long id;

private int value = 0;

public AggregateRoot setValue(int value) {
registerEvent(new Event(this , value));
return this;
}
}
и

Код: Выделить всё

public void pub() {
repository.save(new AggregateRoot().setValue(1));
}
Тест снова пройден, но я ясно вижу, что Spring Data не использует CustomEventPublisher. Я пытался понять, есть ли какой-то способ перехватить вызов репозитория.save() и переопределить поведение по умолчанию, этот подход может работать, даже если нужно заново изобрести велосипед (хотя я не думаю, что код публикации событий домена настолько сложен), но единственное, что я нашел, это Spring Data REST, который выходит за рамки моей компетенции.
Есть предложения по решению этой проблемы?
Заранее спасибо

Подробнее здесь: https://stackoverflow.com/questions/640 ... tpublisher
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»