Struts 2 с использованием StringUtils в выражениях валидатора

Мы используем валидаторы Struts 2 @FieldExpressionValidator а также @ExpressionValidator, Эти валидаторы проверяют выражение OGNL. Есть много случаев, когда мы имеем дело со строками в этих выражениях.

expression="(captcha=='' && captcha== null || ....)

Мы считаем, что это очень полезно, если мы можем использовать StringUtils (isEmpty, trimToEmpty,...) здесь.

Как мы устанавливаем struts.ognl.allowStaticMethodAccess в false, из-за проблем безопасности мы попытались решить эту проблему, добавив этот геттер в действие

public StringUtils getStringUtils(){
        return new StringUtils();
    }

а потом stringUtils.isEmpty(captcha) в выражении. Но это не сработало.

Для отладки мы тестировали

ActionContext.getContext().getValueStack().findValue("stringUtils"); //returns org.apache.commons.lang3.StringUtils@693ade51 which shows there is an object in the stack

ActionContext.getContext().getValueStack().findValue("stringUtils.isEmpty('dd')"); //returns null

Любые комментарии?!

1 ответ

Решение

isEmpty является статическим методом и должен быть доступен статически с префиксом класса. Как только вы используете OGNL, вы должны разрешить статический метод доступа или написать обертку для метода, т.е.

public boolean stringUtilsIsEmpty(String captcha) {
    return StringUtils.isEmpty(captcha);
}

затем

ActionContext.getContext().getValueStack().findValue("stringUtilsIsEmpty('dd')");

Тем не менее, в JSP вы можете сделать

<s:if test="captcha != null && captcha != ''">
  do something
</s:if>

Это делает так же, какStringUtils#isEmpty(),

Другие вопросы по тегам