Axon SpringBeanParameterResolverFactory with null applicatio



10天前我在Axon google群组中问过这个问题,但到目前为止还没有得到任何爱。我开始怀疑在这里问是否更合适。 我正在尝试将 bean 作为参数注入命令处理程序,但无法弄清楚如何正确使用 SpringBeanParameterResolverFactory。

这是我的聚合配置:

@Bean
public AggregateFactory<ChequeSettingsAggregate> settingsAggregateFactory() {
return new SpringPrototypeAggregateFactory<>("settingsAggregate");
}
@Bean(name = "settingsAggregateRepository")
public Repository<SettingsAggregate> settingsAggregateRepository(
EventStore eventStore, SnapshotTriggerDefinition snapshotTriggerDefinition) {
return new MyEventRepository<>(
SettingsAggregate.class,
settingsAggregateFactory(),
eventStore,
snapshotTriggerDefinition);
}

MyEventRepository扩展了EventSourcingRepository。

这是我的服务:

@Service
@Qualifier("settingsService") // Makes no difference with or without
public class SettingsService extends BaseService { ... }

这是我的聚合:

@Aggregate(repository = "settingsAggregateRepository")
public class SettingsAggregate extends AggregateBase {
SettingsAggregate() {
super();
}
void handle(UpdateSettingsCommand cmd, @Qualifier("settingsService") SettingsService settingsService) { // Makes no difference without the qualifier.
settingsService.findOneById(cmd.getId());
...
}
...
}

我收到错误:

nested exception is org.axonframework.messaging.annotation.UnsupportedHandlerException:
Unable to resolve parameter 1 (SettingsService) in handler void 
com.domain.settings.api.eventstore.aggregates.SettingsAggregate.handle(
com.domain.settings.api.eventstore.commands.cheques.UpdateSettingsCommand,
com.domain.settings.api.services.SettingsService).

SpringBeanResolverFactory 不是 MultiParameterResolverFactory 中的工厂之一。此类的工厂列表由 ClasspathParameterResolverFactory 填充。 解析的工厂路径会导致参数解析器工厂对象被实例化(不是从 Spring 的 DI 容器自动连线(。在此代码运行后的某个时候,SpringBeanResolverFactory 作为 bean 添加到 DI 容器中,与其他工厂不同(没有真正深入地研究以弄清楚是什么原因......可能是自动配置(。 但是,此 Bean 未用作解析器,因为尽管它现在是 beean 的应用程序上下文集合的一部分,但它并未添加到 MultiParameterResolverFactory 中的工厂列表中。为了将 SpringBeanResolverFactory 解析器添加到工厂列表中,我在 META-INF/services 中添加了一个 org.axonframework.messaging.annotation.ParameterResolverFactory 文件,其中包含解析器的路径。这会将解析程序添加到工厂列表中,但不会设置它的 applicationContext 变量,这是拉取我要作为参数注入的服务所必需的。因此,当解析命令处理程序服务参数时,SpringBeanResolverFactory 返回 null,因为它没有设置 applicationContext 字段。

因此,当它不用于解析参数时,我看不出将 SpringBeanResolverFactory 添加到 DI 容器(大概是通过自动配置,它设置了 applicationContext 顺便说一句(的目的是什么。如果不设置上下文,我也看不到从类路径实例化 SpringBeanResolverFactory 的目的。

我不确定我在这里错过了什么,但我真的很想弄清楚如何让这个参数注入工作。

提前感谢, 布鲁诺

问题似乎在于如何创建MyEventRepository实例。您需要指定如果默认值(基于类路径的参数解析器查找(不够,Axon 如何解析参数。 将SpringBeanParameterResolver添加到类路径解析器列表中没有帮助,因为它将在 Spring 上下文之外创建一个实例,并且无法访问 Spring ApplicationContext。

在构建器中,您应该传递一个ParameterResolverFactory,告知存储库您希望如何调用该存储库加载的聚合。您可能应该能够从应用程序上下文中自动连接实例,因为 Axon 将注册一个参数解析器,该解析器将自动委托给应用程序上下文中定义的任何其他参数解析器。

一个更好的解决方案是让Spring Boot和Axon为您创建一切。是否有特定原因想要创建自己的存储库子类?为什么不只保留默认值?

最后一点:Axon 的参数注入机制并不是为了完全取代 Spring 的依赖注入而设计的。例如,它不支持@Qualifiers 或InjectionPoints。

最新更新