Обработка целых чисел в виде строк в массивах и списках Thymeleaf

#java #html #thymeleaf

#java #HTML #thymeleaf

Вопрос:

Почему следующие тесты Thymeleaf th:if завершаются неудачей для строк «0», «1» и «9»?

У меня есть Java-массив следующим образом:

 String[] arrayData = {"x", "-1", "0", "1", "9", "10", "11"};
  

"x" Включено, чтобы уточнить, что этот массив может содержать как буквенные, так и числовые значения.

У меня есть шаблон Thymeleaf, содержащий следующее:

 <!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <title>Test</title>
        <meta charset="UTF-8">
    </head>

    <body>
        
        <div th:if="${#arrays.contains(arrayData, '-1')}"
             th:text="'found array string '-1''"></div>
                
        <div th:if="${#arrays.contains(arrayData, '0')}"
             th:text="'found array string '0''"></div>
                
        <div th:if="${#arrays.contains(arrayData, '1')}"
             th:text="'found array string '1''"></div>
                
        <div th:if="${#arrays.contains(arrayData, '9')}"
             th:text="'found array string '9''"></div>
        
        <div th:if="${#arrays.contains(arrayData, '10')}"
             th:text="'found array string '10''"></div>
        
        <div th:if="${#arrays.contains(arrayData, '11')}"
             th:text="'found array string '11''"></div>
                
    </body>

</html>
  

Я ожидаю, что это сгенерирует следующий вывод в браузере:

 found array string '-1'
found array string '0'
found array string '1'
found array string '9'
found array string '10'
found array string '11'
  

Но на самом деле я получаю следующее:

 found array string '-1'
found array string '10'
found array string '11'
  

Вопрос: Почему тесты не выполняются для строк "0" , "1" и "9" ? Что я делаю не так?

Все такие тесты для десяти строковых значений от «0» до «9» завершаются неудачей. Все, что выходит за пределы этого диапазона, работает так, как ожидалось.

То же самое происходит, если я использую ArrayList<String> , с оператором Thymeleaf #lists.contains() .

Версия Thymeleaf — это:

 <dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
    <version>3.0.11.RELEASE</version>
</dependency>
  

Насколько я могу судить, я думаю, что код Thymeleaf, который реализует #arrays.contains() функцию, находится здесь — и это выглядит просто.

Моя версия Java — AdoptOpenJDK 14.

Я не использую Spring в этом конкретном сценарии.


Обновление, после предоставления ответа

Если я тестирую с любым отдельным символом (например x ), возникает та же проблема, что и с 0 через 9 . Таким образом, название несколько вводит в заблуждение в этом отношении.

Комментарии:

1. Это чрезвычайно странно. Пожалуйста, укажите код, в котором вы создаете контекст Thymeleaf и вызываете движок.

2. Когда я запускаю (очень) похожий тест локально, все отображается правильно: found array string -1, found array string 0, found array string 1, found array string 9, found array string 10, found array string 11 . Использование spring 5.2.9.RELEASE и thymeleaf 3.0.11.RELEASE .

3. @Metroids — интересно — спасибо. Я вообще не использую Spring в своем сценарии. Я попробую версию Spring, когда у меня будет такая возможность.

Ответ №1:

Я подозреваю, что если вы не используете Spring , выражения Thymeleaf интерпретируются с использованием OGNL insteald of SPeL , который, по-видимому, обрабатывает односимвольные константы как type char вместо type String , и поэтому #arrays.contains выражения не совпадают.

У меня нет настройки для тестирования OGNL, но, согласно этому сообщению, это должно сработать:

 <div th:text="${#arrays.contains(arrayData, amp;quot;0amp;quot;)}" />
  

(Или, может быть, #arrays.contains(arrayData, '' '0') сработало бы?)

Комментарии:

1. Спасибо — ссылка в вашем ответе объясняет мою проблему. Если бы я тестировал с x , я бы увидел ту же проблему, что и при тестировании с 0 помощью 9 . Ваше '' '0' предложение работает, чтобы принудительно выполнить приведение из char в String .