我正在尝试定义“事件处理程序拦截器”, 我按照官方文档here上的说明进行操作,但是出现以下错误:
org.springframework.beans.factory.BeanCreationException: error when creating the bean with name 'configureEventProcessing' defined in the resource path class [com / prog / boot / config / EventProcessorConfiguration.class]: invalid factory method 'configureEventProcessing': must have an empty non-return type!
我当前的配置呼叫:
@Configuration
public class EventProcessorConfiguration {
@Bean
public void configureEventProcessing(Configurer configurer) {
configurer.eventProcessing()
.registerTrackingEventProcessor("my-tracking-processor")
.registerHandlerInterceptor("my-tracking-processor",
configuration -> new MyEventHandlerInterceptor());
}
}
我的事件MessageHandlerInterceptor
的实现:
public class MyEventHandlerInterceptor implements MessageHandlerInterceptor<EventMessage<?>> {
@Override
public Object handle(UnitOfWork<? extends EventMessage<?>> unitOfWork, InterceptorChain interceptorChain)
throws Exception {
EventMessage<?> event = unitOfWork.getMessage();
String userId = Optional.ofNullable(event.getMetaData().get("userId")).map(uId -> (String) uId)
.orElseThrow(Exception::new);
if ("axonUser".equals(userId)) {
return interceptorChain.proceed();
}
return null;
}
}
我在做什么错了?
谢谢!
答案 0 :(得分:1)
幸运的是,问题很简单(并且与Axon没有直接关系)。
问题是您应该在@Autowired
方法上使用@Bean
而不是configureEventProcessing(Configurer)
。
方法上的@Bean
注释将使其成为“ Bean创建方法”,而您只想绑定到自动配置以“进一步配置”事件处理器。
最后的微调说明,您可以使用EventProcessingConfigurer
作为参数,而不是Configurer#eventProcessing
调用。这样可以将您的代码缩短一点。
更新
鉴于预期的自动接线调整工作,所提供的配置将可以实现。当然,它确实希望事件处理组件存在,它是""my-tracking-processor"
处理组的一部分。
如果该处理组中没有事件处理组件,则不会将任何事件传递给该事件,因此不会将任何事件推入MessageHandlerInterceptor
。
为事件处理组件指定处理组的快速简便的方法是在类级别添加@ProcessingGroup
批注。