Предупреждение Struts 2 ognl.SecurityMemberAccess

В проекте struts 2 я получаю предупреждение ognl при выполнении такого цикла:

<c:set var="unitArray" value="${fn:split(unit, ',')}" />

<c:forTokens items="${key}" delims="," var="name" varStatus="counter">    
    <s:text name="%{#attr.unitArray[#attr.counter.index]}" />   
</c:forTokens>

Предупреждение

    Package of target [javax.servlet.jsp.jstl.core.LoopTagSupport$1Status@353a1d92] or 
      package of member [public int javax.servlet.jsp.jstl.core.LoopTagSupport$1Status.getIndex()] are excluded!

Это можно решить?!


person Alireza Fattahi    schedule 04.05.2016    source источник
comment
Можете ли вы объяснить, чего вы пытаетесь достичь здесь? Почему бы просто не повторить unitArray?   -  person Aleksandr M    schedule 04.05.2016
comment
Уважаемый @AleksandrM, это всего лишь часть кода, я могу разместить здесь полный код, если вы думаете, что это поможет. Но я хочу знать, почему {#attr.unitArray[#attr.counter.index]} генерирует предупреждение и можно ли решить   -  person Alireza Fattahi    schedule 04.05.2016
comment
В: Почему? A: Потому что javax находится в struts.excludedPackageNames. Можете ли вы переписать свой код, чтобы получить значение в тегах jstl и передать его в <s:text>.   -  person Aleksandr M    schedule 04.05.2016
comment
Я столкнулся с несколькими странными ситуациями, когда пытался смешивать теги struts и JSTL, и большинство из них было решено, избегая их смешивания. Вместо использования c:set и цикла с JSTL forTokens, возможно, попробуйте вместо этого использовать теги set и iterator Struts. См. struts.apache.org/docs/iterator.html и struts.apache.org/docs/set.html   -  person Michael Peacock    schedule 05.05.2016


Ответы (1)


Вы можете поместить значение переменной состояния в стек значений и использовать его вместо индекса состояния тега JSTL.

<c:forTokens items="${key}" delims="," var="name" varStatus="counter"> 
    <s:set var="idx">${counter.index}</set>   
    <s:text name="%{#attr.unitArray[#idx]}" />   
</c:forTokens>

Или используйте обратную манипуляцию, просто поместите действие в контекст страницы и используйте его свойство text в <c:out>. Я не использовал этот подход, но вы можете попробовать.

person Roman C    schedule 04.05.2016