Одним из вариантов является использование Spring SPEL.Но это заставляет вас немного изменить выражение и использовать библиотеку Spring:
Выражение может выглядеть так:
'This is user ' + randomString(5) + ' and he is ' + randomInt(18,60) + ' years old!'
или это:
This is user #{randomString(5)} and he is #{randomInt(18,60)} years old!
или вы можете реализовать свой собственный, используя пользовательский TemplateParserContext
.
А вот код:
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
public class SomeTest {
@Test
public void test() {
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression(
"This is user #{randomString(5)} and he is #{randomInt(18,60)} years old!",
new TemplateParserContext() );
//alternative
//Expression exp = parser.parseExpression(
// "'This is user ' + randomString(5) + ' and he is ' + randomInt(18,60) + ' years old!'");
// String message = (String) exp.getValue( new StandardEvaluationContext(this) );
String message = (String) exp.getValue( new StandardEvaluationContext(this) );
}
public String randomString(int i) {
return "rs-" + i;
}
public String randomInt(int i, int j) {
return "ri-" + i + ":" + "j";
}
}
Какой бы объект вы ни передавалиStandardEvaluationContext
должны иметь эти методы.Я помещаю их в тот же класс, в котором также выполняется выражение.