当在UI中留空时,Struts形成长字段不会为空

时间:2012-12-27 12:17:22

标签: java struts struts-config struts-validation apache-commons-beanutils

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

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

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

是的。找到了解决方案。在代码

下面使用的web.xml中
<init-param>
      <param-name>convertNull</param-name>
      <param-value>true</param-value>
</init-param>

因此,这会将默认值0转换为null。

答案 2 :(得分:0)

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

答案 3 :(得分: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.

因此,您将所有传入值转换为代码中的String。 '0'也不是空的,所以如果条件没有进入。

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

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

}