我有一个这样的聚合根:
总根:
@NoArgsConstructor
@Aggregate(repository = "positionAggregateRepository")
@AggregateRoot
@XSlf4j
@Data
public class HopAggregate {
@AggregateIdentifier
private String hopId;
private FilteredPosition position;
private LocalDate positionDate;
@AggregateMember
private Security security;
@CommandHandler
public HopAggregate(NewHopCommand cmd) {
log.info("creating new position , {}", cmd.getDateId());
apply(new HopEvent(cmd.getHopId(), cmd.getDateId(), cmd.getFilteredPosition(), cmd.getSecurity(), false));
}
@CommandHandler
public void handle(UpdateHopCommand cmd) {
log.info("creating hop update event {}", cmd);
apply(new HopEvent(this.hopId, this.positionDate, cmd.getFilteredPosition(), this.security, true));
}
@CommandHandler
public void handle(SecurityUpdate cmd) {
log.info("updating security {}", cmd);
apply(new SecurityUpdateEvent(this.hopId, cmd.getFilteredSecurity()));
}
@EventSourcingHandler
public void on(HopEvent evt) {
if (evt.getIsUpdate()) {
log.info("updating position {}", evt);
this.position = evt.getFilteredPosition();
} else {
log.info("adding new position to date {}", evt);
this.hopId = evt.getHopId();
this.positionDate = evt.getDate();
this.position = evt.getFilteredPosition();
this.security= evt.getSecurity();
}
}
@EventSourcingHandler
public void on(SecurityUpdateEvent evt) {
log.info("hop id {}, security update {}", this.hopId, evt.getFilteredSecurity().getSecurityId());
}
}
子实体:
@XSlf4j
@Data
@RequiredArgsConstructor
@NoArgsConstructor
public class IpaSecurity implements Serializable {
@EntityId
@NonNull
private String id;
@NonNull
private FilteredSecurity security;
}
我的问题是,当我推动并更新时:
@EventHandler
public void handleSecurityEvent(SecurityUpdate securityUpdate) {
log.info("got security event {}", securityUpdate);
commandGateway.send(securityUpdate);
}
我的命令是:
@Data
@RequiredArgsConstructor
@NoArgsConstructor
@ToString
public class SecurityUpdate {
@NonNull
@TargetAggregateIdentifier
private String id;
@NonNull
private FilteredSecurity filteredSecurity;
}
我正在获得未找到聚集根的异常:
命令'com.hb.apps.ipa.events.SecurityUpdate'导致org.axonframework.modelling.command.AggregateNotFoundException(该聚合未在事件存储中找到)
我不确定如何处理这种情况。我的要求是,每个聚合应检查其是否包含安全性,然后在发出命令时对其进行更新。我想念什么?让我知道您是否需要有关代码的更多信息。
感谢您的帮助。
答案 0 :(得分:1)
命令始终针对单个实体。 该实体可以是集合,包含在集合(Axon Framework称为集合成员)中的实体或简单的单例组件。 不过要注意的重要一点是,只有一个实体会处理该命令。
这是您需要在Axon的Command中设置@TargetAggregateIdentifier
的功能,以便在有问题的命令处理程序是其中的一部分时将其路由到单个Aggregate实例。
您收到AggregateNotFoundException
的信号,表明@TargetAggregateIdentifier
命令中带有SecurityUpdate
注释的字段与任何现有的Aggregate不对应。
因此,我怀疑id
中的SecurityUpdate
字段与@AggregateIdentifier
聚合中的任何HopAggregate
带注释的字段都不对应。
上述内容的一部分,在查看您想与您分享的代码片段时,我还有其他一些建议:
@Aggregate
用@AggregateRoot
进行元注释。因此,您无需在Aggregate类上同时指定两者LoggingInterceptor
。您可以在任何能够处理消息的组件上进行配置,从而提供一种通用的日志记录方式。这将省略在消息处理功能中添加日志行的必要性HopEvent
。这样做会使您的HopEvent
非常通用。理想情况下,您的事件可以阐明系统中发生的业务操作。我的经验法则通常是这样的:“如果我将事件类告诉我的业务经理/客户,那么他/她应该确切知道它的作用”。因此,我建议将事件重命名为更具体的内容HopEvent
一样,UpdateHopCommand
非常通用。您的命令应表达在应用程序中执行操作的意图。用户通常将不希望进行更新,例如,他们希望更改地址。您的命令类理想地反映了这一点SecurityUpdate
,而应为UpdateSecurity
。命令是表达意图的请求,消息理想地反映了这一点希望这可以帮助您解决@juggernaut!