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()
,