问题描述
这可能很简单,但我已经尝试了所有 axon 博客,但没有找到如何将 SpringBeanParameterResolverFactory 配置为 MultiParameterResolverFactory 委托列表的一部分的确切配置。
外部服务.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>
内部聚合类
@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$0(AnnotatedMessageHandlingMemberDeFinition.java:51) ~[axon-messaging-4.5.jar:4.5]
...
...
还检查了 MultiparameterresolverFactory 并且列表中没有显示 SpringBeanParameterResolverFactory。
请求帮助。提前致谢。
解决方法
您能否详细说明为什么需要自己配置 ParameterResolver?通常,这根本不需要,尤其是 SpringBeanParameterResolverFactory
不需要,因为它会自动为您配置。
在您的应用程序上下文中简单地提供 ExternalService
,通过直接对其进行注释或使用 bean 创建方法就足够了。
如果您确实需要添加额外的 ParameterResolverFactory
实例,以下方法应该足以自动将它们附加到使用过的 MultiParameterResolverFactory
而不受您的干扰:
- 将
ParameterResolverFactory
的完全限定类名添加到org.axonframework.messaging.annotation.ParameterResolverFactory
文件夹中名为resources/META-INF/services
的文件中。 Axon 使用 Service Loader 方法加载它们,这意味着您可以在需要时附加到它。 - 在 Spring 环境中,您可以简单地使用
ParameterResolverFactory
注释您的自定义@Component
,框架会选择它。简单地说,如果您将其添加到您的应用程序上下文中,Axon 可以找到它。 - 您可以通过将 Axon 的
ParameterResolverFactory
注册为配置 API 的组件来完全覆盖它。为此,您将使用Configurer#registerComponent(Class<C>,Function<Configuration,? extends C>)
方法。请注意,这将要求您提供与前两个选项相关的MultiParameterResolverFactory
。
我写了一篇关于基于集合的一致性验证的 blog 并在 Github 上添加了一些代码示例。示例之一是使用 ParameterResolverFactory。见第 3 点的 https://github.com/AxonIQ/code-samples/tree/master/set-based-validation