Specific check for parent of MethodInvocationInfo ClassLoader
See gh-30389
This commit is contained in:
parent
fe7f8e2de5
commit
cc8c852c2b
|
|
@ -780,11 +780,24 @@ public class MvcUriComponentsBuilder {
|
||||||
|
|
||||||
else if (controllerType.isInterface()) {
|
else if (controllerType.isInterface()) {
|
||||||
ClassLoader classLoader = controllerType.getClassLoader();
|
ClassLoader classLoader = controllerType.getClassLoader();
|
||||||
if (classLoader == null || classLoader.getParent() == null) {
|
if (classLoader == null) {
|
||||||
// JDK interface type from bootstrap loader or platform loader ->
|
// JDK bootstrap loader -> use MethodInvocationInfo ClassLoader instead.
|
||||||
// use higher-level loader which can see Spring infrastructure classes
|
|
||||||
classLoader = MethodInvocationInfo.class.getClassLoader();
|
classLoader = MethodInvocationInfo.class.getClassLoader();
|
||||||
}
|
}
|
||||||
|
else if (classLoader.getParent() == null) {
|
||||||
|
// Potentially the JDK platform loader on JDK 9+
|
||||||
|
ClassLoader miiClassLoader = MethodInvocationInfo.class.getClassLoader();
|
||||||
|
ClassLoader miiParent = miiClassLoader.getParent();
|
||||||
|
while (miiParent != null) {
|
||||||
|
if (classLoader == miiParent) {
|
||||||
|
// Suggested ClassLoader is ancestor of MethodInvocationInfo ClassLoader
|
||||||
|
// -> use MethodInvocationInfo ClassLoader itself instead.
|
||||||
|
classLoader = miiClassLoader;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
miiParent = miiParent.getParent();
|
||||||
|
}
|
||||||
|
}
|
||||||
Class<?>[] ifcs = new Class<?>[] {controllerType, MethodInvocationInfo.class};
|
Class<?>[] ifcs = new Class<?>[] {controllerType, MethodInvocationInfo.class};
|
||||||
return (T) Proxy.newProxyInstance(classLoader, ifcs, interceptor);
|
return (T) Proxy.newProxyInstance(classLoader, ifcs, interceptor);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue