#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».