Машина состояния пружины — JpaRepositoryStateMachine Не ошибка управляемого типа

#java #spring #spring-boot #spring-data-jpa #spring-statemachine

Вопрос:

Я столкнулся с проблемой с машиной состояния spring с постоянной конфигурацией при ее использовании с конфигурацией БД @EnableJpaRepositories

Конфигурация машины состояния пружины выглядит следующим образом: (У меня есть две машины состояния пружины, например: OrderMachine, UserMachine)

 @Slf4j
@Configuration
@EnableStateMachineFactory(name = “ORDERMACHINE")
public class OrderMachineConfiguration extends StateMachineConfigurerAdapter<States, Events> {

    @Autowired
    @Qualifier("OrderMachinePersister")
    private StateMachineRuntimePersister<States, Events, String> stateMachineRuntimePersister;


    @Override
    public void configure(StateMachineTransitionConfigurer<States, Events> transitions) throws Exception {
        transitions
                
                .withExternal().source(States.NEW).target(States.PREORDER).event(Events.CREATE)
                .and()
                .withExternal().source(States.PREORDER).target(States.CANCELLED).event(Events.CANCELLED);
    }

    @Override
    public void configure(StateMachineStateConfigurer<States, Events> states) throws Exception {
        states
                .withStates()
                .initial(States.NEW)
                .states(EnumSet.allOf(States.class))
                .end(States.CANCELLED);
    }

    @Override
    public void configure(StateMachineConfigurationConfigurer<States, Events> config) throws Exception {
        config
                .withPersistence()
                .runtimePersister(stateMachineRuntimePersister);
    }

    @Bean(name = "OrderMachineService")
    public StateMachineService<States, Events> stateMachineServiceOrder(
             StateMachineFactory<States, Events> stateMachineFactory,
             StateMachineRuntimePersister<States, Events, String> stateMachineRuntimePersister) {
        return new DefaultStateMachineService<States, Events>(stateMachineFactory, stateMachineRuntimePersister);
    }

    @Bean(name = "OrderMachinePersister")
    public StateMachineRuntimePersister<States, Events, String> stateMachineRuntimePersisterOrder(
            JpaStateMachineRepository jpaStateMachineRepository) {
        return new JpaPersistingStateMachineInterceptor<>(jpaStateMachineRepository);
    }
}
 

Конфигурация БД:

 @Slf4j
@Configuration
@ConfigurationProperties("spring.datasource")
@EnableJpaRepositories(basePackages = “”org.machine.repository", entityManagerFactoryRef = “stateMachineEntityManager”, transactionManagerRef = “stateMachineTransactionManager”)
public class StateMachineDBConfiguration  {

    @Bean
    public DataSource stateMachineDatasource() {

        Properties props = getProperties();
        return DataSourceBuilder.create()
                .url(env.getProperty(MACHINE_DATASOURCE_URL))
                .driverClassName(env.getProperty(SPRING_DATASOURCE_DRIVER_CLASS_NAME))
                .username(props.getProperty(MACHINE_DATASOURCE_USERNAME))
                .password(props.getProperty(MACHINE_DATASOURCE_PASSWORD))
                .build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean stateMachineEntityManager() {
        return getEntityManager(stateManagerDatasource(), “org.machine.model”);
    }

    @Bean
    public PlatformTransactionManager stateMachineTransactionManager() {
        return getTransactionManager(stateMachineEntityManager());
    }

}
 

Зависимости :

         <dependency>
            <groupId>org.springframework.statemachine</groupId>
            <artifactId>spring-statemachine-core</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.statemachine</groupId>
            <artifactId>spring-statemachine-recipes-common</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.statemachine</groupId>
            <artifactId>spring-statemachine-data-jpa</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
 

Но с вышеуказанной конфигурацией я получаю ошибку

 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaStateMachineRepository' defined in org.springframework.statemachine.data.jpa.JpaStateMachineRepository defined in @EnableJpaRepositories declared on StateMachineDBConfiguration: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class org.springframework.statemachine.data.jpa.JpaRepositoryStateMachine

Caused by: java.lang.IllegalArgumentException: Not a managed type: class org.springframework.statemachine.data.jpa.JpaRepositoryStateMachine
 

Ответ №1:

пара вещей, которые вы можете попробовать:

1 — включите эту конфигурацию в свой проект

 spring.datasource.main.allow-bean-definition-overriding: true
 

2 — В случае возникновения конфликта между вашими репозиториями и репозиториями государственных машин вы можете сопоставить пакеты, подлежащие сканированию

 @EntityScan(basePackages = "your.entities.package")
@EnableJpaRepositories(basePackages = "your.repositories.package")
 

Комментарии:

1. Спасибо, вариант 2 сработал, добавив пакет репозитория Spring state machine «org.springframework.statemachine.data.jpa».