我一直在徒劳地尝试使用存储库类的load方法加载聚合。我知道load()方法需要一个字符串参数,但是我的集合标识符是整数。我尝试将其转换为字符串,但无法加载聚合。我一直空着。我的代码如下所示
@Autowired
private Repository<Product> repository;
@CommandHandler
public Order(CreateOrderCommand cmd){
try{
//This line throws an error
Product product = (Product) repository.load(Integer.toString(cmd.getProductId()));
}
catch (Exception ex){
System.out.println("Oops! Error Occured: " + ex.getMessage());
}
apply(
new OrderCreatedEvent(
cmd.getOrderId(), cmd.getPrice(), cmd.getNumber(), cmd.getProductId()
)
);
}
您已经注意到,Axon将对集合标识符强制使用String
。这并不意味着您需要直接提供String
。只要您实施了明智的toString()
方法,它就可以很好地工作。因此,使用Integer
作为聚合标识符将导致该字段的toString()
结果用作聚合标识符。
话虽如此,我很惊讶您无法基于此加载汇总。也许我们需要在此基础上进行一些跟进,但首先,我想对您共享的摘录发表评论。
似乎您在Order
类上具有构造函数命令处理程序。而且,这向我表明Order
类是一个聚合。我想指出,通过no手段,我是否建议从另一个聚合中加载聚合。
将Order
聚合中的锁与Product
聚合中的锁联系起来,从而比CreateOrderCommand
的发送者所期望的阻塞系统更大的部分。聚合之间的通信应始终通过事件消息保持异步。因此,这需要专用的事件处理组件,该组件根据已发布的事件在两个实例之间进行协调。
因此,我强烈建议您重写此事的逻辑。当涉及到聚合加载时,现在很难为您提供一个推理。因此,让我问几个后续问题。我建议顺便用回复来更新您的原始请求;保持良好的连续性。
您使用哪种版本的Axon?您是否在Product
汇总中使用任何有趣的配置?您要将应用程序与Axon Server配对吗?如果是,则为标准版还是企业版,以及哪个版本?您是直接使用Configuration API还是axon-spring-boot-starter
?