gpt4 book ai didi

parameters - 从类路径加载器实例化时具有 null applicationContext 的 Axon SpringBeanParameterResolverFactory

转载 作者:行者123 更新时间:2023-12-04 10:53:17 26 4
gpt4 key购买 nike

我 10 天前在 Axon google group 中问过这个问题,但到目前为止没有得到任何人的爱。我开始怀疑在这里问是否更合适。我试图将一个 bean 作为参数注入(inject)命令处理程序,但无法弄清楚如何正确使用 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 容器 Autowiring )。这段代码运行后的某个时间,SpringBeanResolverFactory 作为一个 bean 添加到 DI 容器中,这与其他工厂不同(还没有真正深入地了解是什么原因造成的......可能是自动配置)。然而,这个 bean 没有被用作解析器,因为虽然它现在是 beean 的应用程序上下文集合的一部分,但它没有被添加到 MultiParameterResolverFactory 中的工厂列表中。为了将 SpringBeanResolverFactory 解析器添加到工厂列表,我将 org.axonframework.messaging.annotation.ParameterResolverFactory 文件添加到 META-INF/services 中,其中包含解析器的路径。这会将解析器添加到工厂列表中,但不会设置它的 applicationContext 变量,需要拉取我想作为参数注入(inject)的服务。因此,当解析命令处理程序服务参数时,SpringBeanResolverFactory 返回 null,因为它没有设置 applicationContext 字段。

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

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

提前致谢,布鲁诺

最佳答案

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

在您的构建器中,您应该传递一个 ParameterResolverFactory,它告诉存储库您希望如何调用该存储库加载的聚合。您应该能够从应用程序上下文中 Autowiring 一个实例,因为 Axon 将注册一个 ParameterResolver,它将自动委托(delegate)给应用程序上下文中定义的任何其他 ParameterResolver。

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

最后一点:Axon 的参数注入(inject)机制并不是为了完全替代 Spring 的依赖注入(inject)而设计的。例如,它不支持 @QualifierInjectionPoint

关于parameters - 从类路径加载器实例化时具有 null applicationContext 的 Axon SpringBeanParameterResolverFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59358704/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com