2

在 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>

在验证规则.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;
        }
    }

有人可以告诉我,我如何确保如果该字段在 UI 中留空,则该值应为 null 而不是 0。有没有办法这样做???我正在使用 struts 1.2

4

4 回答 4

3

AFAIK,对于 Struts1,您应该使用 String 而不是 Long 来表示用户输入的值,因为这是 Struts 用用户实际输入的内容填充表单 bean 并让您重新显示带有错误值的输入页面的唯一方法。

Struts 将尝试将空字符串转换为 Long,如果字符串不代表有效的 long 值,则将 Long 初始化为 0。这是 Struts 的众多弱点之一。

于 2012-12-27T12:41:04.483 回答
2

是的 。找到了修复。在 web.xml 中使用下面的代码

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

所以这会将默认的 0 转换为 null。

于 2012-12-28T05:21:36.980 回答
0

这是因为您的字段存在,当不存在时它只是返回 null

于 2012-12-27T12:56:02.373 回答
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 条件。

您可以像这里一样更改您的代码

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

} 
于 2012-12-27T12:56:34.673 回答