Как преобразовать тип для выражений JEXL?

#java #type-conversion #jexl

#java #преобразование типов #jexl

Вопрос:

Я использую выражения JEXL, чтобы пользователи могли указывать выражения во время выполнения, и мое приложение будет обрабатывать их соответствующим образом. Теперь в качестве особого случая пользователи хотят сравнивать значения с плавающей запятой, однако в контексте JEXL эти переменные содержат строки типа «6.8». Движок JEXL жалуется, что не может обрабатывать строки и числа. Пока все хорошо.

Однако в https://commons.apache.org/proper/commons-jexl/reference/syntax.html Я нигде не вижу никакого намека на преобразование типов.

Есть ли какой-нибудь способ преобразовать строку в float внутри выражения?

Ответ №1:

Итак, я нашел способ решить эту проблему, используя пространства имен функций (см. https://commons.apache.org/proper/commons-jexl/reference/syntax.html#Functions ). Поскольку, похоже, документации по этому вопросу недостаточно, я публикую решение.

Создайте JexlEngine с дополнительными функциями, добавленными через пространства имен.

     Map<String, Object> namespace = new TreeMap<>();
    namespace.put("float", Float.class);
        
    JexlBuilder builder = new JexlBuilder();
    builder.silent(false);
    builder.strict(true);
    builder.namespaces(namespace);
    JexlEngine engine = builder.create();
 

С помощью этого вы сможете обрабатывать такие выражения, как

 float:parseFloat("10") > 8
 

таким образом, преобразование типов теперь возможно в формуле.