在命令调度拦截器中使用 entityManager

Used entityManager in command dispatch interceptors

我在 JPA/Spring 中使用 Axon 4.3。 我想在我的拦截器中注入 entityManager,所以我在我的配置中使用了 ContainerManagedEntityManagerProvider。但是当我 运行 我的应用程序

时出现此错误

Description: Parameter 0 of method configureCommandBus in AxonConfig required a bean of type 'org.axonframework.springboot.util.jpa.ContainerManagedEntityManagerProvider' that could not be found.

Action: Consider defining a bean of type 'org.axonframework.springboot.util.jpa.ContainerManagedEntityManagerProvider' in your configuration.

@Configuration
@AutoConfigureAfter(AxonAutoConfiguration.class)
public class AxonConfig {

    @Bean
    public CommandBus configureCommandBus(org.axonframework.springboot.util.jpa.ContainerManagedEntityManagerProvider containerManagedEntityManagerProvider) {
        CommandBus commandBus = SimpleCommandBus.builder().build();
        commandBus.registerDispatchInterceptor(
                new CatalogDispatchInterceptor(containerManagedEntityManagerProvider.getEntityManager()));
        return commandBus;
    }

}


public class CatalogDispatchInterceptor implements MessageDispatchInterceptor<CommandMessage<?>> {

    private final EntityManager entityManager;

    public CatalogDispatchInterceptor(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Override
    public BiFunction<Integer, CommandMessage<?>, CommandMessage<?>> handle(
            List<? extends CommandMessage<?>> messages) {
        return (index, command) -> {
             (CreateCatalogCommand.class.isInstance(command.getPayloadType())) { }
            return command;
        };
    }

}

Axon创建的ContainerManagedEntityManagerProvider实例,如果你使用的是Spring Boot Starter,通过JpaAutoConfiguration看起来如下:

@Bean
@ConditionalOnMissingBean
public EntityManagerProvider entityManagerProvider() {
    return new ContainerManagedEntityManagerProvider();
}

因此我的第一个尝试是连接 EntityManagerProvider 而不是 ContainerManagedEntityManagerProvider。如果这不起作用,那么您正在处理一个 Spring bean 排序问题,我认为这有点超出了 (axon) 框架的范围。当然,您总是可以自己创建 ContainerManagedEntityManagerProvider,我很确定这会解决手头的问题。

希望任何一种解决方案都能帮助您解决问题![​​=16=]