diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configuration/StateMachineConfiguration.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configuration/StateMachineConfiguration.java index 650e461f..5440ec15 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configuration/StateMachineConfiguration.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configuration/StateMachineConfiguration.java @@ -19,6 +19,7 @@ import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.List; +import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; @@ -30,6 +31,7 @@ import org.springframework.statemachine.StateMachine; import org.springframework.statemachine.config.EnableStateMachine; import org.springframework.statemachine.config.ObjectStateMachineFactory; import org.springframework.statemachine.config.StateMachineConfig; +import org.springframework.statemachine.config.StateMachineConfigurerAdapter; import org.springframework.statemachine.config.builders.StateMachineConfigBuilder; import org.springframework.statemachine.config.builders.StateMachineConfigurationConfig; import org.springframework.statemachine.config.builders.StateMachineStates; @@ -38,8 +40,18 @@ import org.springframework.statemachine.config.common.annotation.AbstractImporti import org.springframework.statemachine.config.common.annotation.AnnotationConfigurer; import org.springframework.util.ClassUtils; +/** + * {@link Configuration} which gets imported from {@link EnableStateMachine} and registers + * a {@link StateMachine} build from a {@link StateMachineConfigurerAdapter} via + * a {@link BeanDefinition}. + * + * @author Janne Valkealahti + * + * @param the type of state + * @param the type of event + */ @Configuration -public class StateMachineConfiguration, E extends Enum> extends +public class StateMachineConfiguration extends AbstractImportingAnnotationConfiguration, StateMachineConfig> { private final StateMachineConfigBuilder builder = new StateMachineConfigBuilder(); @@ -67,7 +79,7 @@ public class StateMachineConfiguration, E extends Enum> ext return types; } - private static class StateMachineDelegatingFactoryBean, E extends Enum> + private static class StateMachineDelegatingFactoryBean extends BeanDelegatingFactoryBean,StateMachineConfigBuilder,StateMachineConfig> implements SmartLifecycle, BeanNameAware { @@ -82,7 +94,7 @@ public class StateMachineConfiguration, E extends Enum> ext this.clazzName = clazzName; this.contextEvents = contextEvents; } - + @Override public void setBeanName(String name) { this.beanName = name; @@ -90,6 +102,12 @@ public class StateMachineConfiguration, E extends Enum> ext @Override public void afterPropertiesSet() throws Exception { + // do not continue without configurers, it would not work + if (getConfigurers() == null || getConfigurers().size() == 0) { + throw new BeanDefinitionStoreException( + "Cannot configure state machine due to missing configurers. Did you remember to use " + + "@EnableStateMachine with a StateMachineConfigurerAdapter."); + } for (AnnotationConfigurer, StateMachineConfigBuilder> configurer : getConfigurers()) { Class clazz = configurer.getClass(); if (ClassUtils.getUserClass(clazz).getName().equals(clazzName)) { diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configuration/StateMachineFactoryConfiguration.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configuration/StateMachineFactoryConfiguration.java index be3e6d7d..5e7f1aac 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configuration/StateMachineFactoryConfiguration.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configuration/StateMachineFactoryConfiguration.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.List; import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.FactoryBean; @@ -33,6 +34,7 @@ import org.springframework.core.type.AnnotationMetadata; import org.springframework.statemachine.config.EnableStateMachineFactory; import org.springframework.statemachine.config.ObjectStateMachineFactory; import org.springframework.statemachine.config.StateMachineConfig; +import org.springframework.statemachine.config.StateMachineConfigurerAdapter; import org.springframework.statemachine.config.StateMachineFactory; import org.springframework.statemachine.config.builders.StateMachineConfigBuilder; import org.springframework.statemachine.config.builders.StateMachineConfigurationConfig; @@ -42,8 +44,18 @@ import org.springframework.statemachine.config.common.annotation.AbstractImporti import org.springframework.statemachine.config.common.annotation.AnnotationConfigurer; import org.springframework.util.ClassUtils; +/** + * {@link Configuration} which gets imported from {@link EnableStateMachineFactory} and registers + * a {@link StateMachineFactory} build from a {@link StateMachineConfigurerAdapter} via + * a {@link BeanDefinition}. + * + * @author Janne Valkealahti + * + * @param the type of state + * @param the type of event + */ @Configuration -public class StateMachineFactoryConfiguration, E extends Enum> extends +public class StateMachineFactoryConfiguration extends AbstractImportingAnnotationConfiguration, StateMachineConfig> { private final StateMachineConfigBuilder builder = new StateMachineConfigBuilder(); @@ -70,7 +82,7 @@ public class StateMachineFactoryConfiguration, E extends Enum< return types; } - private static class StateMachineFactoryDelegatingFactoryBean, E extends Enum> implements + private static class StateMachineFactoryDelegatingFactoryBean implements FactoryBean>, BeanFactoryAware, InitializingBean { private final StateMachineConfigBuilder builder; @@ -104,6 +116,12 @@ public class StateMachineFactoryConfiguration, E extends Enum< @Override public void afterPropertiesSet() throws Exception { + // do not continue without configurers, it would not work + if (configurers == null || configurers.size() == 0) { + throw new BeanDefinitionStoreException( + "Cannot configure state machine due to missing configurers. Did you remember to use " + + "@EnableStateMachineFactory with a StateMachineConfigurerAdapter."); + } for (AnnotationConfigurer, StateMachineConfigBuilder> configurer : configurers) { Class clazz = configurer.getClass(); if (ClassUtils.getUserClass(clazz).getName().equals(clazzName)) { diff --git a/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ConfigurationTests.java b/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ConfigurationTests.java index ece26624..4ede1187 100644 --- a/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ConfigurationTests.java +++ b/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ConfigurationTests.java @@ -15,8 +15,8 @@ */ package org.springframework.statemachine.config; -import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; @@ -27,6 +27,7 @@ import java.util.EnumSet; import java.util.List; import org.junit.Test; +import org.springframework.beans.factory.BeanCreationException; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -149,6 +150,18 @@ public class ConfigurationTests extends AbstractStateMachineTests { assertThat(((List)o3).size(), is(2)); } + @Test(expected = BeanCreationException.class) + public void testEnableStateMachineNoAdapter() { + context.register(Config12.class); + context.refresh(); + } + + @Test(expected = BeanCreationException.class) + public void testEnableStateMachineFactoryNoAdapter() { + context.register(Config13.class); + context.refresh(); + } + @Configuration @EnableStateMachine public static class Config1 extends EnumStateMachineConfigurerAdapter { @@ -534,4 +547,14 @@ public class ConfigurationTests extends AbstractStateMachineTests { } + @Configuration + @EnableStateMachine + public static class Config12 { + } + + @Configuration + @EnableStateMachineFactory + public static class Config13 { + } + }