Skip to content

Commit ad6159e

Browse files
committed
#1368 - respect FactoryBean.getObjectType contract, use context classloader where appropriate
- DatastoreServiceMethodInvokingFactoryBean.getObjectType returns null if not initialized (i.e. arguments is null, getArguments() returns Object[]). that allows AbstractAutowireCapableBeanFactory to initialize DatastoreServiceMethodInvokingFactoryBean if necessary - AbstractDatastoreInitializer and SoftServiceLoader use the context classloader to load data service classes. this way, autowiring data services by type works reliably with spring boot devtools restart (RestartClassLoader)
1 parent 25fa48b commit ad6159e

File tree

3 files changed

+6
-4
lines changed

3 files changed

+6
-4
lines changed

grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/DatastoreServiceMethodInvokingFactoryBean.groovy

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ class DatastoreServiceMethodInvokingFactoryBean extends MethodInvokingFactoryBea
2222

2323
@Override
2424
Class<?> getObjectType() {
25-
arguments[0] as Class<?>
25+
if (arguments) {
26+
return arguments[0] as Class<?>
27+
}
28+
return null
2629
}
2730

2831
@Override

grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/services/SoftServiceLoader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public static Logger getLogger(Class type) {
8888
* @return A new service loader
8989
*/
9090
public static <S> SoftServiceLoader<S> load(Class<S> service) {
91-
return SoftServiceLoader.load(service, SoftServiceLoader.class.getClassLoader());
91+
return SoftServiceLoader.load(service, Thread.currentThread().getContextClassLoader());
9292
}
9393

9494
/**

grails-datastore-gorm/src/main/groovy/org/grails/datastore/gorm/bootstrap/AbstractDatastoreInitializer.groovy

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,8 +333,7 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{
333333

334334
private Class<?> loadServiceClass(Class<Service> clazz) {
335335
final String serviceClassName = clazz.package.getName() + '.' + clazz.simpleName[1..-15]
336-
final ClassLoader cl = org.grails.datastore.mapping.reflect.ClassUtils.classLoader
337-
final Class<?> serviceClass = cl.loadClass(serviceClassName)
336+
final Class<?> serviceClass = classLoader.loadClass(serviceClassName)
338337
serviceClass
339338
}
340339

0 commit comments

Comments
 (0)