Parameters Axon SpringbeanParameterResolveFactory在从类路径加载程序实例化时具有空applicationContext

Parameters Axon SpringbeanParameterResolveFactory在从类路径加载程序实例化时具有空applicationContext,parameters,aggregate,resolver,axon,Parameters,Aggregate,Resolver,Axon,10天前,我在Axon google小组中问过这个问题,但到目前为止,我还没有得到爱。我开始怀疑在这里问是否更合适。 我试图将bean作为参数注入到命令处理程序中,但不知道如何正确使用SpringbeanParameterResolveFactory 这是我的聚合配置: @Bean public AggregateFactory<ChequeSettingsAggregate> settingsAggregateFactory() { return new SpringPro

10天前,我在Axon google小组中问过这个问题,但到目前为止,我还没有得到爱。我开始怀疑在这里问是否更合适。 我试图将bean作为参数注入到命令处理程序中,但不知道如何正确使用SpringbeanParameterResolveFactory

这是我的聚合配置:

@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);
}
这是我的总结:

@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不是多参数溶出工厂中的工厂之一。此类的工厂列表由ClassPathParameterResolveFactory填充。 解析的工厂路径导致参数解析器工厂对象被实例化(不是从Spring的DI容器自动连接)。这段代码运行后的某个时候,SpringBeanResolverFactory会作为bean添加到DI容器中,这与其他工厂不同(还没有真正深入到找出原因…可能是自动配置)。 然而,这个bean没有被用作解析器,因为尽管它现在是beean的应用程序上下文集合的一部分,但它没有被添加到multiparametresolverfactory中的工厂列表中。为了将SpringBeanResolverFactory解析器添加到工厂列表中,我向META-INF/services添加了一个org.axonframework.messaging.annotation.ParameterResolveFactory文件,其中包含解析器的路径。这会将解析器添加到工厂列表中,但不会设置它的applicationContext变量,该变量是提取我要作为参数注入的服务所需的。因此,当解析命令处理程序服务参数时,SpringBeanResolverFactory返回null,因为它没有设置applicationContext字段

因此,我看不出将SpringBeanResolverFactory添加到DI容器的目的是什么(大概是通过autoconfig,它将applicationContext设置为btw),而不是用于解析参数。如果不设置上下文,我也看不到从类路径实例化SpringBeanResolverFactory的目的

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

提前感谢,,
布鲁诺

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

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

更好的解决方案是让Spring引导和Axon为您创建一切。您希望创建自己的存储库子类的具体原因是什么?为什么不保留默认值呢


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

我创建自己的存储库类的原因是我们允许不同的聚合类型具有相同的id,因此在加载时需要通过aggregateName进一步筛选。我并不完全赞成这种方法(允许使用相同的id),但它产生于需要将系统中的一个实体转换为一个不同的实体,而该实体的id已经通过系统传播(不同的应用程序数据库已经存储了该值)。如果给它一个新的id,则需要在存储的所有位置进行替换。自动连接参数ResolveFactory参数ResolveFactory将获得一个多参数ResolveFactory,其中包含所有必需的工厂,并将其传递给构建器,现在一切正常。结果很简单。谢谢。
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).