我有一个包含多个AggregateMembers的聚合。否是因为找不到for 1 aggregateMember(Referentschap)此聚合成员中的CommandHandlers的问题。使用AggregateTestFixture<>(Onderzoek.class)进行junit测试时也会出现此问题。
在一个AggregateMember Waarschuwing
中,CommandHandlers会按要求到达,但在另一个aggregateMember Referentschap
中,未找到Commandhandlers。我的问题是我如何解决这个问题?有没有一种方法,我可以做一个配置来解决这个问题?
奇怪的问题是,在一些调试项目的副本中,出现了同样的问题,但随后问题被交换到Waarschuwing
,并且Referentschap
正常。这种奇怪的问题交换给我的印象是,在如何收集CommandHandlers方面存在问题。
update:在Axoniq的提示上,仅将@Aggregae
注解放置在根聚合上。从Intellij IDE中清除chaces和所有内容,并重新运行junit测试。现在,在AggregateMembers Referentschap
和Waarschuwing
上都出现了未找到ComandHandler问题。
我用一个Axon测试容器做了一些集成测试,它们都成功了。看起来这是一个JUnit测试问题,其中聚合类的扩展顺序与找到的CommandHandler相关。
Axon 4.5.17
Spring Boot 2.7.12
Java temurin 17.0.6
@NoArgsConstructor
public class Onderzoek extends OnderzoekReferentschap {
@CommandHandler
public Onderzoek(InitieerOnderzoek command) {
apply(OnderzoekGeinitieerd.builder().build());
}
@EventSourcingHandler
public void onderzoekGeinitieerd(OnderzoekGeinitieerd event) {
this.onderzoekId = event.getOnderzoekId();
this.onderzoekStatus = INITIEEL;
}
x
@NoArgsConstructor
public abstract class OnderzoekReferentschap extends OnderzoekMaatregel {
@AggregateMember
private final Map<UUID, Referentschap> referentschappen = new HashMap<>();
@CommandHandler
public void verwerkReferentschapOntstaan(VerwerkReferentschapOntstaan command) {
apply(ReferentschapOntstaanVerwerkt.builder()
.onderzoekId(command.getOnderzoekId())
.referentschapId(command.getReferentschapId())
.build());
}
}
@EventSourcingHandler
public void referentschapOntstaanVerwerkt(ReferentschapOntstaanVerwerkt event) {
UUID referentschapId = event.getReferentschapId();
Referentschap referentschap = Referentschap.builder()
.referentschapId(referentschapId)
.persoonId(event.getPersoonId())
.build();
referentschappen.put(referentschapId, referentschap);
}
}
@NoArgsConstructor
abstract class OnderzoekMaatregel extends OnderzoekBasis {
@AggregateMember
final Map<UUID, Waarschuwing> waarschuwingen = new HashMap<>();
@CommandHandler
public void verwerkWaarschuwingOpgelegd(VerwerkWaarschuwingOpgelegd command) {
apply(WaarschuwingOpgelegdVerwerkt.builder()
.onderzoekId(command.getOnderzoekId())
.referentschapId(command.getWaarschuwingId())
.build());
}
@EventSourcingHandler
public void waarschuwingOpgelegdVerwerkt(WaarschuwingOpgelegdVerwerkt event) {
UUID waarschuwingId = event.getWaarschuwingId();
waarschuwingen.put(waarschuwingId, new Waarschuwing(waarschuwingId));
}
}
@NoArgsConstructor
abstract class OnderzoekBasis {
@AggregateIdentifier
UUID onderzoekId;
OnderzoekStatus onderzoekStatus;
}
的数据
下面的类是AggregateMembers,它具有令人讨厌的Not Found CommandHandlers。
@Aggregate
@EqualsAndHashCode
@NoArgsConstructor
public class Referentschap {
@EntityId
private UUID referentschapId;
// This command handler is never reached.
@CommandHandler
public void verwerkReferentschapBijgewerkt(VerwerkReferentschapBijgewerkt command) {
apply(ReferentschapBijgewerktVerwerkt.builder()
.onderzoekId(command.getOnderzoekId())
.referentschapId(command.getReferentschapId())
.einddatum(command.getEinddatum())
.build());
}
@Aggregate
@EqualsAndHashCode
@NoArgsConstructor
public class Waarschuwing {
@EntityId
private UUID waarschuwingId;
// this command handler is never reached.
@CommandHandler
public void verwerkWaarschuwingVerlopen(VerwerkWaarschuwingVerlopen command) {
apply(WaarschuwingVerlopenVerwerkt.builder()
.onderzoekId(command.getOnderzoekId())
.waarschuwingId(command.getWaarschuwingId())
.verloopdatum(command.getVerloopdatum())
.build());
}
}
的字符串
1条答案
按热度按时间jdgnovmf1#
这是一种直觉,但我猜Axon Framework的
AggregateModel
没有正确构造,因为聚合成员上的@Aggregate
注解也是如此。聚合成员只能通过
@AggregateMember
注解在聚合中引用。@Aggregate
注解的作用是:1.将类标记为Aggregate,并且
1.让它通过Axon的Spring自动配置自动连接。
如果您有一个“简单”聚合,那么您只需要在所谓的聚合根上使用
@Aggregate
注解一次。如果你有一个polymorphic aggregate,你只需要在根类和所有具体实现(本质上是图的子类)上使用@Aggregate
注解。任何不是根聚合或多态聚合的类都不需要
@Aggregate
注解。我认为这是罪魁祸首,因为@Aggregate
注解执行自动连接,并且用于多态聚合逻辑。因此,请从您的成员中删除注解,并告诉我们这是否解决了问题!