如何在手动 Spring 表达式语言评估期间使用 属性 参考 ${key:default}
How to use property reference ${key:default} during manual Spring Expression Language Evaluation
我正在使用 spring SpelExpressionParser + TemplateParserContext 解析一段文本以替换部分字符串。我正在将地图设置为上下文的根对象。
String htmlText = IOUtils.toString(MailService.class.getResourceAsStream(resourceName),Charset.defaultCharset());
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression(htmlText, new TemplateParserContext());
StandardEvaluationContext context = new StandardEvaluationContext();
if(contextMap != null) {
context.setRootObject(contextMap);
}
String result = expression.getValue(context,String.class);
return result;
这似乎可行,但需要我使用一个看起来有点过分的表达式来引用每个 属性:
#{['my.key']}
有没有一种方法可以简化我正在尝试做的事情,使其更类似于 spring 的 属性 文件类型语法,例如
${my.key}
根据@ArtemBilans 的评论,解析器上下文中的 MapAccessor 使这项工作有效,只需稍作调整。您需要使用相同的语法引用所有内容。默认情况下,解析器使用 #{} 但您可以根据需要将其更改为 ${}。
ExpressionParser parser = new SpelExpressionParser();
TemplateParserContext templateParserContext = new TemplateParserContext();
StandardEvaluationContext context = new StandardEvaluationContext();
//add map accessor to allow referencing map properties without ['']
context.addPropertyAccessor(new MapAccessor());
//bean has 'name' property
Bean bean = new Bean("myname");
//create a map with a bean, a string, and a nested map as props
Map<String,Object> map = MapUtils.createHashMap("w", "world","b",bean,"nested", MapUtils.createHashMap("key","others"));
//all values can be accessed using standard #{a.b.c} syntax
Expression expression = parser.parseExpression("hello #{w} from #{b.name} and #{nested.key}", templateParserContext);
//result is: 'hello world from myname and others'
String result = (String) expression.getValue(context, map);
我正在使用 spring SpelExpressionParser + TemplateParserContext 解析一段文本以替换部分字符串。我正在将地图设置为上下文的根对象。
String htmlText = IOUtils.toString(MailService.class.getResourceAsStream(resourceName),Charset.defaultCharset());
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression(htmlText, new TemplateParserContext());
StandardEvaluationContext context = new StandardEvaluationContext();
if(contextMap != null) {
context.setRootObject(contextMap);
}
String result = expression.getValue(context,String.class);
return result;
这似乎可行,但需要我使用一个看起来有点过分的表达式来引用每个 属性:
#{['my.key']}
有没有一种方法可以简化我正在尝试做的事情,使其更类似于 spring 的 属性 文件类型语法,例如
${my.key}
根据@ArtemBilans 的评论,解析器上下文中的 MapAccessor 使这项工作有效,只需稍作调整。您需要使用相同的语法引用所有内容。默认情况下,解析器使用 #{} 但您可以根据需要将其更改为 ${}。
ExpressionParser parser = new SpelExpressionParser();
TemplateParserContext templateParserContext = new TemplateParserContext();
StandardEvaluationContext context = new StandardEvaluationContext();
//add map accessor to allow referencing map properties without ['']
context.addPropertyAccessor(new MapAccessor());
//bean has 'name' property
Bean bean = new Bean("myname");
//create a map with a bean, a string, and a nested map as props
Map<String,Object> map = MapUtils.createHashMap("w", "world","b",bean,"nested", MapUtils.createHashMap("key","others"));
//all values can be accessed using standard #{a.b.c} syntax
Expression expression = parser.parseExpression("hello #{w} from #{b.name} and #{nested.key}", templateParserContext);
//result is: 'hello world from myname and others'
String result = (String) expression.getValue(context, map);