The shouldSkipMembers
method uses type.getCanonicalName()
, which may return null
for anonymous, local and other types leading to NPE when calling startsWith
.
The above happened when reading Java8 compiled code of com.mongodb.connection.ServerType
.
Retrieving constructor arguments and registering them for binding failed because a synthetic constructor uses an anonymous class (com.mongodb.connection.ServerType$1
).
synthetic ServerType(java.lang.String arg0, int arg1, com.mongodb.connection.ServerType$1 arg2) { // <init> //(Ljava/lang/String;ILcom/mongodb/connection/ServerType$1;)V
<localVar:index=0 , name=this , desc=Lcom/mongodb/connection/ServerType;, sig=null, start=L0, end=L1>
<localVar:index=1 , name=x0 , desc=Ljava/lang/String;, sig=null, start=L0, end=L1>
<localVar:index=2 , name=x1 , desc=I, sig=null, start=L0, end=L1>
<localVar:index=3 , name=x2 , desc=Lcom/mongodb/connection/ServerType$1;, sig=null, start=L0, end=L1>
L0 {
aload 0 // reference to self
aload 1 // reference to arg0
iload 2 // reference to arg1
invokespecial com/mongodb/connection/ServerType.<init>(Ljava/lang/String;I)V
return
}
L1 {
}
}
ReflectionHints hints = new ReflectionHints();
BindingReflectionHintsRegistrar reflectionHintsRegistrar = new BindingReflectionHintsRegistrar();
Arrays.stream(com.mongodb.connection.ServerType.class.getDeclaredConstructors()).forEach(ctor -> {
Arrays.stream(ctor.getParameterTypes()).forEach(type -> {
reflectionHintsRegistrar.registerReflectionHints(hints, type);
});
});
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.startsWith(String)" because the return value of "java.lang.Class.getCanonicalName()" is null
at org.springframework.aot.hint.BindingReflectionHintsRegistrar.shouldSkipMembers(BindingReflectionHintsRegistrar.java:74)
at org.springframework.aot.hint.BindingReflectionHintsRegistrar.lambda$registerReflectionHints$0(BindingReflectionHintsRegistrar.java:87)
at org.springframework.aot.hint.ReflectionHints.registerType(ReflectionHints.java:86)
at org.springframework.aot.hint.ReflectionHints.registerType(ReflectionHints.java:109)
at org.springframework.aot.hint.BindingReflectionHintsRegistrar.registerReflectionHints(BindingReflectionHintsRegistrar.java:86)
at org.springframework.aot.hint.BindingReflectionHintsRegistrar.registerReflectionHints(BindingReflectionHintsRegistrar.java:65)
related: spring-projects/spring-data-mongodb#4248
Comment From: bclozel
Thanks @christophstrobl for the analysis!