AxoniQ 如何将 SpringBeanParameterResolverFactory 配置为 MultiParameterResolverFactory 的一部分,以便 spring bean 依赖注入

AxoniQ how to configure SpringBeanParameterResolverFactory as part of MultiParameterResolverFactory for spring beans to dependecy inject

这可能是一个简单的问题,但我已经尝试了所有的 axon 博客,但没有找到关于如何将 SpringBeanParameterResolverFactory 配置为 MultiParameterResolverFactory 委托列表的一部分的确切配置。

ExternalService.java

@Component
public class ExternalService {

    public void testcall(){
        System.out.println("test operation called");
    }
}

pom.xml

<axon.version>4.5</axon.version>

...
...

  <dependency>
            <groupId>org.axonframework</groupId>
            <artifactId>axon-spring-boot-starter</artifactId>
            <version>${axon.version}</version>
        </dependency>

内部聚合class

  @CommandHandler
    public GiftCard(IssueCmd cmd, ExternalService externalService) {
        externalService.handle();

        logger.debug("handling {}", cmd);
        if (cmd.getAmount() <= 0) {
            throw new IllegalArgumentException("amount <= 0");
        }
        apply(new IssuedEvt(cmd.getId(), cmd.getAmount()));
    }

但是在运行时,我遇到异常

Caused by: org.axonframework.messaging.annotation.UnsupportedHandlerException: Unable to resolve parameter 1 (ExternalService) in handler public io.axoniq.demo.giftcard.command.GiftCard(io.axoniq.demo.giftcard.api.IssueCmd,io.axoniq.demo.giftcard.service.ExternalService).
    at org.axonframework.messaging.annotation.AnnotatedMessageHandlingMember.<init>(AnnotatedMessageHandlingMember.java:76) ~[axon-messaging-4.5.jar:4.5]
    at org.axonframework.messaging.annotation.AnnotatedMessageHandlingMemberDefinition.lambda$createHandler[=14=](AnnotatedMessageHandlingMemberDefinition.java:51) ~[axon-messaging-4.5.jar:4.5]
...
...

还检查了 MultiparameterresolverFactory,列表中没有显示 SpringBeanParameterResolverFactory。

请求帮助。提前致谢。

我在第3点写了一个blog about set-based consistency validation and added some code samples on Github for it. One of the examples is using a ParameterResolverFactory. See https://github.com/AxonIQ/code-samples/tree/master/set-based-validation

能否详细说明为什么需要自己配置ParameterResolver?通常,这根本不需要,特别是 SpringBeanParameterResolverFactory,因为它将为您自动配置。

只需在您的应用程序上下文中提供 ExternalService,通过直接注释或使用 bean 创建方法就足够了。


如果您确实需要添加额外的 ParameterResolverFactory 实例,以下方法应该足以自动将它们附加到使用的 MultiParameterResolverFactory 而无需您的干预:

  • ParameterResolverFactory 的完全限定 class 名称添加到 resources/META-INF/services 文件夹中名为 org.axonframework.messaging.annotation.ParameterResolverFactory 的文件中。 Axon 使用 Service Loader 方法加载它们,这意味着您可以根据需要附加到此。
  • 在 Spring 环境中时,您可以简单地用 @Component 注释您的自定义 ParameterResolverFactory 并且框架会选择它。所以简单地说,如果你把它添加到你的应用程序上下文中,Axon 就可以找到它。
  • 您可以通过将 Axon 的 ParameterResolverFactory 注册为配置 API 的组件来完全覆盖它。为此,您将使用 Configurer#registerComponent(Class<C>, Function<Configuration, ? extends C>) 方法。请注意,此 要求您提供与前两个选项相对应的 MultiParameterResolverFactory