Senden von Spring-Domänenereignissen mit einem benutzerdefinierten ApplicationEventPublisherJava

Java-Forum
Anonymous
 Senden von Spring-Domänenereignissen mit einem benutzerdefinierten ApplicationEventPublisher

Post by Anonymous »

Ich versuche, eine Anwendung mithilfe von Spring Boot/Spring Data zu implementieren und dabei den DDD-Architekturrichtlinien zu folgen. Ich habe einen Aggregate Root, der Domänenereignisse mit der Methode AbstractAggregateRoot::registerEvent() veröffentlicht. Darüber hinaus muss ich diese Ereignisse zu Protokollierungs-/Nachverfolgungszwecken abfangen, also habe ich beschlossen, ein Experiment durchzuführen:
Implementieren Sie zunächst einen benutzerdefinierten ApplicationEvent Publisher

Code: Select all

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);
}

//.....
}
Und dann als Bean registrieren

Code: Select all

@Configuration
public class CustomEventPublisherConfig {

@Bean
@Primary
public ApplicationEventPublisher getCustomEventPublisher(ApplicationEventPublisher publisher , RabbitTemplate rabbitTemplate) {
return new CustomEventPublisher(publisher, rabbitTemplate);
}
}
Dies funktioniert einwandfrei, sobald ich Ereignisse aus einem Beispielobjekt explizit mit einem injizierten ApplicationEventPublisher veröffentliche

Code: Select all

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

@EventListener
public void sub(Event e) {
this.value = e.getValue();
}
und ich habe den Protokolleintrag „Senden eines Ereignisses...“ erhalten
Dann habe ich versucht, den Aggregatstamm zu definieren

Code: Select all

@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;
}
}
und

Code: Select all

public void pub() {
repository.save(new AggregateRoot().setValue(1));
}
Der Test wurde erneut bestanden, aber ich kann deutlich erkennen, dass Spring Data den CustomEventPublisher nicht verwendet. Ich habe versucht zu verstehen, ob es eine Möglichkeit gibt, den Aufruf „repository.save()“ abzufangen und das Standardverhalten zu überschreiben. Dieser Ansatz könnte auch dann funktionieren, wenn das Rad neu erfunden werden muss (ich glaube jedoch nicht, dass der Code für die Veröffentlichung von Domain-Ereignissen so kompliziert ist), aber das Einzige, was ich gefunden habe, ist Spring Data REST, das außerhalb meines Anwendungsbereichs liegt.
Irgendwelche Vorschläge zur Lösung dieses Problems?
Vielen Dank im Voraus

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post