Skip to content

NullPointerException in BindingReflectionHintsRegistrar for anonymous classes #29657

@christophstrobl

Description

@christophstrobl

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

Metadata

Metadata

Assignees

Labels

theme: aotAn issue related to Ahead-of-time processingtype: bugA general bug

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions