Given

//    Expression exp = EXPRESSION_PARSER.parseExpression("#${dynamic.enabled:false} == true ? T(com.util.ValidationAnnotationUtils) : T(java.lang.Object)");
//    Expression exp = EXPRESSION_PARSER.parseExpression("#{ '${dynamic.enabled:false}' }");
    Expression exp = EXPRESSION_PARSER.parseExpression("#{${simple.map}}");

Got

Exception in thread "main" org.springframework.expression.spel.SpelParseException: Expression [#{${simple.map}}] @1: EL1043E: Unexpected token. Expected 'identifier' but was 'lcurly({)'
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.internalException(InternalSpelExpressionParser.java:1056)
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatToken(InternalSpelExpressionParser.java:938)
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.maybeEatFunctionOrVar(InternalSpelExpressionParser.java:436)
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatStartNode(InternalSpelExpressionParser.java:525)
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatPrimaryExpression(InternalSpelExpressionParser.java:365)
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatUnaryExpression(InternalSpelExpressionParser.java:359)
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatPowerIncDecExpression(InternalSpelExpressionParser.java:318)
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatProductExpression(InternalSpelExpressionParser.java:296)
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatSumExpression(InternalSpelExpressionParser.java:278)
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatRelationalExpression(InternalSpelExpressionParser.java:233)
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatLogicalAndExpression(InternalSpelExpressionParser.java:220)
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatLogicalOrExpression(InternalSpelExpressionParser.java:207)
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatExpression(InternalSpelExpressionParser.java:168)
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.doParseExpression(InternalSpelExpressionParser.java:139)
    at org.springframework.expression.spel.standard.SpelExpressionParser.doParseExpression(SpelExpressionParser.java:63)
    at org.springframework.expression.spel.standard.SpelExpressionParser.doParseExpression(SpelExpressionParser.java:34)
    at org.springframework.expression.common.TemplateAwareExpressionParser.parseExpression(TemplateAwareExpressionParser.java:56)
    at org.springframework.expression.common.TemplateAwareExpressionParser.parseExpression(TemplateAwareExpressionParser.java:45)

Java 17 Spring 6.0.11

Comment From: sbrannen

That is to be expected.

#{${simple.map}} is not a valid SpEL expression.

org.springframework.expression.ExpressionParser.parseExpression(String) expects a SpEL expression string which is not wrapped in anything and does not contain property placeholders.

#{...} is the syntax for including a SpEL expression in a template -- for example, in @Value("#{...}").

${simple.map} is a property placeholder for a configured string value -- for example, in @Value("${my.property.name}").

For further information, please consult the Spring Expression Language section of the reference manual or ask questions on Stack Overflow.

In light of the above, I am closing this issue.

Comment From: anaconda875

But why I put these "invalid" spel to @Value, it works?

Comment From: sbrannen

But why I put these "invalid" spel to @Value, it works?

Because @Value is processed differently.

Specifically, a StringValueResolver (actually an EmbeddedValueResolver) is used to support property placeholders, and internally a StandardBeanExpressionResolver is used, which internally uses a org.springframework.expression.ParserContext.

If you for some reason need to set up a parser context, you can do so and pass that to org.springframework.expression.ExpressionParser.parseExpression(String, ParserContext).

If you have additional questions, please study the documentation and code yourself or ask on Stack Overflow.

Thanks