Axon框架抽象聚合子类用@CreationPolicy抛InstantiationException:Bug还是特性?
问题分析与解决方案
这是Axon Framework在聚合继承场景下的特性限制,并非Bug。
原因解释
当你把@Aggregate注解标注在抽象类Fruit上时,Axon框架处理带有@CreationPolicy(CREATE_IF_MISSING)的命令处理器时,会尝试实例化抽象的Fruit类来创建聚合实例——但抽象类本身无法被实例化,因此抛出InstantiationException。
而当你把Apple和Peer改为独立聚合类(即子类自身标注@Aggregate)时,框架会正确识别具体子类为聚合根,创建实例时直接实例化Apple或Peer,所以@CreationPolicy(CREATE_IF_MISSING)能正常工作。
至于之前没加@CreationPolicy时没问题,是因为此时框架仅处理已存在的聚合实例,不会触发新聚合的创建逻辑,也就不会尝试实例化抽象类。
可行解决方案
方案一:迁移@Aggregate注解到具体子类
将抽象类Fruit上的@Aggregate移除,仅在具体子类Apple、Peer上标注@Aggregate,这样既可以复用Fruit的通用逻辑,又能让框架正确实例化具体聚合类:
abstract class Fruit { @AggregateIdentifier private UUID fruitId; // 通用逻辑代码 ... } @Aggregate class Apple extends Fruit { @CreationPolicy(CREATE_IF_MISSING) @CommandHandler() void myAppleCommand(AppleCommand command) { ... apply(myAppleEvent); } } @Aggregate class Peer extends Fruit { @CreationPolicy(CREATE_IF_MISSING) @CommandHandler() void myPeerCommand(PeerCommand command) { ... apply(myPeerEvent); } }
方案二:抽象类用@AggregateRoot配合子类@Aggregate
如果需要在抽象类中保留聚合相关的通用配置(比如通用事件处理器),可以在Fruit上标注@AggregateRoot(而非@Aggregate),同时在子类上标注@Aggregate。不过Axon中@Aggregate已包含聚合根的标识,方案一的适用性更广。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

