From 0df3f9a8985cf258202d4b221e63bbd37d92172d Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Mon, 12 Mar 2018 19:59:35 +0000 Subject: [PATCH] Fix issue with devtools - Where class is resolved, use ClassLoader from BeanClassLoaderAware which is the one working with devtools. - Fixes #531 --- .../configuration/StateMachineConfiguration.java | 12 ++++++++++-- .../StateMachineFactoryConfiguration.java | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) 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 d50fdb34..4015a214 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.BeanClassLoaderAware; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.annotation.Autowired; @@ -131,7 +132,7 @@ public class StateMachineConfiguration extends private static class StateMachineDelegatingFactoryBean extends BeanDelegatingFactoryBean,StateMachineConfigBuilder,StateMachineConfig> - implements SmartLifecycle, BeanNameAware { + implements SmartLifecycle, BeanNameAware, BeanClassLoaderAware { private String clazzName; private Boolean contextEvents; @@ -139,6 +140,7 @@ public class StateMachineConfiguration extends private DisposableBean disposableBean; private String beanName; private StateMachineMonitor stateMachineMonitor; + private ClassLoader classLoader; public StateMachineDelegatingFactoryBean(StateMachineConfigBuilder builder, Class> clazz, String clazzName, Boolean contextEvents) { @@ -152,11 +154,17 @@ public class StateMachineConfiguration extends this.beanName = name; } + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.classLoader = classLoader; + } + @SuppressWarnings("unchecked") @Override public void afterPropertiesSet() throws Exception { AnnotationConfigurer, StateMachineConfigBuilder> configurer = - (AnnotationConfigurer, StateMachineConfigBuilder>) getBeanFactory().getBean(Class.forName(clazzName)); + (AnnotationConfigurer, StateMachineConfigBuilder>) getBeanFactory() + .getBean(ClassUtils.forName(clazzName, classLoader)); getBuilder().apply(configurer); StateMachineConfig stateMachineConfig = getBuilder().getOrBuild(); 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 1acaa378..115cdc8f 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.BeanClassLoaderAware; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.FactoryBean; @@ -111,13 +112,14 @@ public class StateMachineFactoryConfiguration extends } private static class StateMachineFactoryDelegatingFactoryBean implements - FactoryBean>, BeanFactoryAware, InitializingBean { + FactoryBean>, BeanFactoryAware, InitializingBean, BeanClassLoaderAware { private final StateMachineConfigBuilder builder; private BeanFactory beanFactory; private StateMachineFactory stateMachineFactory; private String clazzName; private Boolean contextEvents; + private ClassLoader classLoader; @SuppressWarnings("unused") public StateMachineFactoryDelegatingFactoryBean(StateMachineConfigBuilder builder, String clazzName, Boolean contextEvents) { @@ -141,11 +143,17 @@ public class StateMachineFactoryConfiguration extends return true; } + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.classLoader = classLoader; + } + @SuppressWarnings("unchecked") @Override public void afterPropertiesSet() throws Exception { AnnotationConfigurer, StateMachineConfigBuilder> configurer = - (AnnotationConfigurer, StateMachineConfigBuilder>) beanFactory.getBean(Class.forName(clazzName)); + (AnnotationConfigurer, StateMachineConfigBuilder>) beanFactory + .getBean(ClassUtils.forName(clazzName, classLoader)); builder.apply(configurer); StateMachineConfig stateMachineConfig = builder.getOrBuild();