Как соединить две числовые строки в jexl?

Например:

@Test
public void test2() {
    JexlEngine jexl = new JexlEngine();
    jexl.setLenient(false);
    jexl.setSilent(false);
    JexlContext jc = new MapContext();
    Expression exp = jexl.createExpression("\"1\"+\"1\"");
    System.out.println(exp.evaluate(jc));
}

Фактический результат:

2

мой ожидаемый результат:

"11"

Пожалуйста, скажите мне, что не так в приведенном выше примере. И как я могу получить ожидаемый результат.

Спасибо!

1 ответ

Решение

Взгляните на http://svn.apache.org/viewvc/commons/proper/jexl/tags/COMMONS_JEXL_2_1_1/src/main/java/org/apache/commons/jexl2/JexlArithmetic.java?view=markup (строка 373), JexlArithmetic.add() приводит строки к числовым значениям и только в последнем случае использует конкатенацию строк для работы с операндами. В частности:

409         } catch (java.lang.NumberFormatException nfe) {
410             // Well, use strings!
411             return toString(left).concat(toString(right));
412         }

Подкласс JexlArithmetic уместно здесь. Мы можем дать тот, который демонстрирует поведение, которое вы хотите new JexlEngine(), Вот один из возможных подклассов:

public class NoStringCoercionArithmetic extends JexlArithmetic {
    public NoStringCoercionArithmetic(boolean lenient) {
        super(lenient);
    }

    public NoStringCoercionArithmetic() {
        this(false);
    }

    @Override
    public Object add(Object left, Object right) {
        if (left instanceof String || right instanceof String) {
            return left.toString() + right.toString();
        }
        else {
            return super.add(left, right);
        }
    }
}

И в тесте:

JexlEngine jexl = new JexlEngine(null, new NoStringCoercionArithmetic(), null, null);
jexl.setLenient(false);
jexl.setStrict(true); 
JexlContext jc = new MapContext();
Expression exp = jexl.createExpression("\"1\"+\"1\"");
System.out.println(exp.evaluate(jc)); // expected result "11"
Другие вопросы по тегам