使用连字符时,Spring Expression Language(SpEL)不起作用

时间:2017-05-22 21:51:49

标签: java spring spring-el

我试图使用Spring Expression Language解析表达式。

如果 myVariable 值设置为“first-name”(带连字符的值),则获取class.org.springframework.expression.spel.SpelParseException

ExpressionParser parser = new SpelExpressionParser();
String parsedDynamicVariablesValue = parser.parseExpression("#" + myVariable).getValue(stdContext, String.class);

如何用连字符解决问题?

使用的参考:
Spring Expression Language (SpEL)

2 个答案:

答案 0 :(得分:1)

它没有那样工作,你试图解析#first-name - 就像Java一样,你不能在变量名中使用连字符。

答案 1 :(得分:0)

我们可以在方括号内的表达式中用引号引起连字符或破折号。下面这样的东西会起作用。

String expressionString =“#{response.headers ['header-1']}”;

例如:

    String response = "{\"response\":{\"headers\":{\"header-1\":\"header2\",\"header1\":\"header1\"},\"body\":{\"body\":\"body\"}}}";
    String expressionString = "#{response.headers['header-1']}";
    ExpressionParser parser = new SpelExpressionParser();
    DefaultConversionService conversionService = new DefaultConversionService();
    conversionService.addConverter(new Converter<JsonPropertyAccessor.ToStringFriendlyJsonNode, String>() {
        public String convert(JsonPropertyAccessor.ToStringFriendlyJsonNode source) {
            return source.toString();
        }
    });
    StandardTypeConverter standardTypeConverter = new StandardTypeConverter(conversionService);
    StandardEvaluationContext context = new StandardEvaluationContext();
    context.setTypeConverter(standardTypeConverter);

    JsonPropertyAccessor jsonPropertyAccessor = new JsonPropertyAccessor();
    context.addPropertyAccessor(jsonPropertyAccessor);
    context.setRootObject(response);

    TemplateParserContext templateParserContext = new TemplateParserContext();
    Expression expression = parser.parseExpression(expressionString, templateParserContext);
    System.out.println(expression.getValue(context));

输出: 标头2