Starting with Boot 3.1.6/Framework 6.0.14, the following SpEL expression fails to resolve the referenced type, but only when devtools is on the classpath: T(com.example.MyEnum).VALUE
The following exception is thrown:
Exception in thread "restartedMain" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50)
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1005E: Type cannot be found 'com.example.demo.MyEnum'
at org.springframework.expression.spel.support.StandardTypeLocator.findType(StandardTypeLocator.java:128)
at org.springframework.expression.spel.ExpressionState.findType(ExpressionState.java:180)
at org.springframework.expression.spel.ast.TypeReference.getValueInternal(TypeReference.java:70)
at org.springframework.expression.spel.ast.CompoundExpression.getValueRef(CompoundExpression.java:61)
at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:97)
at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:114)
at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:142)
at com.example.demo.DemoApplication.main(DemoApplication.java:15)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
... 2 more
Downgrading to Framework 6.0.13, or removing devtools fixes it.
Reproducer: demo.zip
Main:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
System.out.println(new SpelExpressionParser()
.parseExpression("T(com.example.demo.MyEnum).VALUE")
.getValue());
}
}
MyEnum.java:
public enum MyEnum {
VALUE
}
Extract and run ./mvnw spring-boot:run
, the exception occurs.
Open the pom.xml and change the Spring Framework version to 6.0.13, run again and the code succeeds.
Alternatively, leave the Spring Framework version as is and remove the devtools dependency instead, run again and the code succeeds as well.
Maybe related: #31579
Comment From: jhoeller
Ouch that's an oversight in the StandardTypeLocator
cache handling where we mean to not cache if the class is reloadable, but the code path actually not just bypasses the cache, it also bypasses the return statement... Sorry for the glitch, we'll fix this ASAP.