More testing required, but this seems to make the gateway happy (no more errors in the logs).
override fun startup(activationState: LicenseState) {
...
logger.debug("Registering components...")
val originalClassLoader = Thread.currentThread().contextClassLoader
Thread.currentThread().contextClassLoader = context.perspectiveContext.javaClass.classLoader
...
componentRegistry.registerComponent(...)
modelDelegateRegistry.register(...)
...
Thread.currentThread().contextClassLoader = originalClassLoader
}
Edit: The current hack. This has the benefit of also resolving my own reusable schemas.
class DelegatedClassLoader(parent: ClassLoader, private vararg val delegates: ClassLoader) :
ClassLoader(parent) {
override fun findClass(name: String): Class<*> {
for (delegate in delegates) {
try {
return delegate.loadClass(name)
} catch (_: ClassNotFoundException) {}
}
throw ClassNotFoundException(name)
}
override fun findResource(name: String): URL? =
delegates.firstNotNullOfOrNull { it.getResource(name) }
override fun findResources(name: String): Enumeration<URL> =
Collections.enumeration(delegates.flatMap { it.getResources(name).toList() })
}
fun withContextClassLoaders(vararg delegates: ClassLoader, block: () -> Unit) {
val originalContextClassLoader = Thread.currentThread().contextClassLoader
Thread.currentThread().contextClassLoader =
DelegatedClassLoader(originalContextClassLoader, *delegates)
block()
Thread.currentThread().contextClassLoader = originalContextClassLoader
}
// GatewayHook
override fun startup(activationState: LicenseState) {
...
logger.debug("Registering components...")
withContextClassLoaders(
this.javaClass.classLoader,
context.perspectiveContext.javaClass.classLoader,
) {
componentRegistry.registerComponent(...)
modelDelegateRegistry.register(...)
}
...
}
This fix is now included in 0.7.2
.