无法使用Integer AggregateIdentifier的Repository.load()加载聚合

问题描述 投票:0回答:1

我一直在徒劳地尝试使用存储库类的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()
            )
    );
}
repository aggregate cqrs axon
1个回答
0
投票

您已经注意到,Axon将对集合标识符强制使用String。这并不意味着您需要直接提供String。只要您实施了明智的toString()方法,它就可以很好地工作。因此,使用Integer作为聚合标识符将导致该字段的toString()结果用作聚合标识符。

话虽如此,我很惊讶您无法基于此加载汇总。也许我们需要在此基础上进行一些跟进,但首先,我想对您共享的摘录发表评论。

似乎您在Order类上具有构造函数命令处理程序。而且,这向我表明Order类是一个聚合。我想指出,通过no手段,我是否建议从另一个聚合中加载聚合。

Order聚合中的锁与Product聚合中的锁联系起来,从而比CreateOrderCommand的发送者所期望的阻塞系统更大的部分。聚合之间的通信应始终通过事件消息保持异步。因此,这需要专用的事件处理组件,该组件根据已发布的事件在两个实例之间进行协调。

因此,我强烈建议您重写此事的逻辑。当涉及到聚合加载时,现在很难为您提供一个推理。因此,让我问几个后续问题。我建议顺便用回复来更新您的原始请求;保持良好的连续性。

您使用哪种版本的Axon?您是否在Product汇总中使用任何有趣的配置?您要将应用程序与Axon Server配对吗?如果是,则为标准版还是企业版,以及哪个版本?您是直接使用Configuration API还是axon-spring-boot-starter

© www.soinside.com 2019 - 2024. All rights reserved.