Thymeleaf: Случайная ошибка при использовании #session - Исключительная ситуация при вычислении выражения SpringEL - PullRequest
0 голосов
/ 02 марта 2019

Мы используем Spring webflow + ThymeLeaf и пытаемся получить доступ к session.getAttribute () на html-странице.

Немного нового для Thymeleaf, и я понимаю, что у Thymeleaf есть 2 способа решения проблемы, а именно сессия.$ {session.something} и $ {# session.getAttribute ('кое-что')}.

Код, который мы используем, похож на приведенный ниже, который иногда дает сбой.

<div th:if="${(#session.getAttribute('booleanAttribute'))}">  
...
</div>

В локальной среде я никогда не вижу сбоев, и все работает как положено.В производстве это терпит неудачу appox.200 раз за 30 минут со следующей ошибкой -

org.thymeleaf.exceptions.TemplateProcessingException:  Exception evaluating SpringEL expression: "(#session.getAttribute('booleanAttribute'))" (template: "base" - line 80, col 10)

Я немного неохотно ставлю нулевые проверки, чтобы увидеть, является ли (#session) нулевым или нет, не понимая, почему работает локально нормально.Итак, у меня есть вопрос -

Что может быть не так, как указано выше, и как я могу воспроизвести локально, чтобы я мог подтвердить, что исправление, которое я размещаю, будет работать во всех средах?

1 Ответ

0 голосов
/ 05 марта 2019

Согласно docs :

#session: прямой доступ к объекту javax.servlet.http.HttpSession, связанному с текущим запросом.

В моем тестировании #session является нулевым, когда сессия заканчивается.В тех случаях, когда у пользователя истек срок действия сеанса, использование #session приведет к исключению нулевой точки (Method call: Attempted to call method getAttribute(java.lang.String) on null context object).Вы должны быть в состоянии проверить это, удалив JSESSIONID cookie.

${session} с другой стороны - это SessionAttributesMap, который, как представляется, никогда не будет нулевым - даже если нет действительногосессия.В этом случае выражение ${session.booleanAttribute} все равно будет работать, просто оцените как false.

...