Struts образуют длинное поле, не равное нулю, если оставить пустым в интерфейсе

В Struts-config.xml

<form-bean name="myForm" type="com.validator.CustomeDynaValidatorForm">
      <form-property name="testId" type="java.lang.Long"/>
</form-bean>

В validation.xml

<form name="myForm">
      <field property="testId" depends="required">
        <msg name="required" key="test ID required."/>
      </field>

</form>

В validation-rules.xml

<validator name="required"
            classname="com.validator.CustomFieldChecks"
               method="validateRequired"
               methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
                  msg=""/>

В CustomFieldChecks.java

public static boolean validateRequired(Object bean, ValidatorAction va, Field field, ActionMessages errors, 
                                           Validator validator, HttpServletRequest request)
    {
        String value = null;

        if (isString(bean))
        {
            value = (String) bean;
        }
        else
        {
            value = ValidatorUtils.getValueAsString(bean, 
                                                    field.getProperty());
            **// here value is 0 , when the field is left blank in UI** 
        }

        if (GenericValidator.isBlankOrNull(value))
        {
            //add error message

            return false;
        }
        else
        {
            return true;
        }
    }

Может кто-то плз, дайте мне знать, как я могу убедиться, что если поле оставлено пустым в пользовательском интерфейсе, значение должно быть нулевым, а не 0 . Есть ли способ сделать это??? Я использую распорки 1.2

4 ответа

AFAIK, в Struts1 вы должны использовать String, а не Long для представления значения, введенного пользователем, потому что это единственный способ для Struts заполнить ваш компонент формы тем, что фактически ввел пользователь, и позволить вам снова отобразить страницу ввода с ошибочными значениями.

Struts попытается преобразовать пустую строку в Long и инициализирует Long в 0, если строка не представляет допустимое значение long. Это одно из многих слабых мест Struts.

Да. Нашел исправление. В web.xml использован код ниже

<init-param>
      <param-name>convertNull</param-name>
      <param-value>true</param-value>
</init-param>

Так что это преобразует значение по умолчанию 0 в ноль.

Это потому, что ваше поле существует, оно просто возвращает ноль, когда не существует

GenericValidator.isBlankOrNull(value) behavior is 

Checks if the field isn't null and length of the field is greater than zero not including whitespace.

Следовательно, вы конвертируете все входящие значения в строку в вашем коде. '0' также не пусто, поэтому оно не входит в условие.

Вы можете изменить свой код, как здесь

if (GenericValidator.isBlankOrNull(value) ) {
    ...
} else if (value != null && value.equals("0")) {
//Add here your sepecial error message for zero

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