Параметры Struts недоступны в теге ‹s:if›

У меня есть страница .jsp, которая выполняет следующую проверку, чтобы увидеть, должно ли отображаться сообщение об ошибке:

<s:if test="#parameters.error == 1">
    <ul><li>
        <s:text name="login.error"/>
    </li></ul>
</s:if>

Параметр ошибки исходит из параметра запроса (например, /myPage.action?error=1).

Я отладил страницу jsp в методе org.apache.struts2.views.jspComponentTagSupport.doStartTag(), и оттуда я могу получить доступ к ValueStack и увидеть, что объект HttpParameters действительно содержит параметр «ошибка», к которому я могу получить доступ через :

stack.getContext().get("parameters")).get("error")).getValue();

Это вернет строку со значением 1, как и ожидалось.
Однако при дальнейшей отладке кода кажется, что он неправильно оценивает тестовый атрибут тега <s:if>.
Метод ognl.ASTEq.getValueBody(OgnlContext, Object) пытается получить значение дочерних элементов проанализированного тестового запроса.
Она заканчивается методом ognl.OgnlRuntime.getFieldValue(OgnlContext, Object, String, boolean), который возвращает результат NotFound, несмотря на то, что HttpParameters содержит искомое значение ("error").

Похоже, это ошибка в struts/ognl, связанная с анализом параметров в стеке значений, но я не уверен.

Я использую Struts 2.5.5. Недавно обновленный со Struts 2.3.x, и этот код отлично работал с этой версией, поэтому либо это ошибка, либо что-то изменилось в доступе к этим свойствам, о чем я не знаю.


person Richard    schedule 01.11.2016    source источник
comment
Если ошибка сохраняется в запросе в бэкенде, то на jsp вы можете получить к ней доступ с помощью #request.error что-то в этом роде.   -  person Will    schedule 01.11.2016
comment
Это также может помочь stackoverflow.com/questions/40327981/   -  person Alireza Fattahi    schedule 01.11.2016
comment
@AlirezaFattahi И его следует снова открыть.   -  person Aleksandr M    schedule 01.11.2016
comment
... вновь открылся :)   -  person Andrea Ligios    schedule 01.11.2016
comment
@AndreaLigios, АлександрМ, спасибо за открытие!   -  person Alireza Fattahi    schedule 02.11.2016


Ответы (2)


Согласно краткому исследованию, это может быть связано с проблемой WW-4572, также известной как рефакторинг управления параметрами, от Map из Objects до класса HttpParameter, содержащего Parameter объектов, поставляемых с версией 2.5.5.

Глядя на Parameter class, кажется, достаточно вызвать для него атрибут value, например:

<s:if test="%{#parameters.error.value == 1}">

Я надеюсь, что это так, но тем временем: попробуйте использовать больше механизмов фреймворка и меньше параметров запроса (например, используйте переменную ошибки с геттером и сеттером в базовом действии или, что еще лучше, используйте actionErrors и fieldErrors для переноса сообщений, и проверьте их наличие, чтобы определить, когда произошла ошибка).

person Andrea Ligios    schedule 01.11.2016
comment
Использование #parameters.value.error не сработало, но я добавил переменную ошибки в действие и могу получить к ней доступ, используя ‹s:if test=%{error ==1}›, что, вероятно, в любом случае лучше, как вы упомянули. Я все еще думаю, что есть ошибка в том, как struts анализирует параметры, которые, вероятно, были введены WW -4572. - person Richard; 01.11.2016
comment
В ответе была опечатка, не могли бы вы попробовать с error.value вместо value.error ? - person Andrea Ligios; 01.11.2016
comment
Нет, это тоже не работает. Кажется, он неправильно анализирует то, что я вижу в своем отладчике. Он может получить доступ к HttpParameters в стеке значений, но похоже, что он анализирует параметры и ошибку как отдельные имена полей и пытается найти их независимо в стеке, поэтому вместо получения HttpParameters через поле параметров и последующего поиска ошибки в HttpParameters , он ищет поле ошибки в самом стеке значений (по крайней мере, это мое лучшее предположение о том, что он делает прямо сейчас). - person Richard; 01.11.2016
comment
Поехали ;) +1 за выявление причины. - person Aleksandr M; 01.11.2016
comment
Пожалуйста, сообщите о проблеме в JIRA, она связана с изменением, упомянутым @AndreaLigios - person Lukasz Lenart; 02.11.2016

Только в Struts 2.5.5.

Если вы хотите проверить значение параметра error, то:

<s:if test="#parameters.get('error').value == 1">
    <ul><li>
        <s:text name="login.error"/>
    </li></ul>
</s:if>

Если вы хотите проверить, существует ли параметр:

<s:if test="#parameters.contains('error')">
</s:if>

Андреа прав в отношении причины и использования параметров запроса.

person Aleksandr M    schedule 01.11.2016
comment
Это сработало. Он должен быть указан на странице миграции по адресу struts.apache.org. /docs/struts-23-to-25-migration.html . - person rveach; 19.09.2017
comment
@rveach Нет. Это только для 2.5.5. - person Aleksandr M; 26.09.2017