2

我无法同时使用 validate 方法中的验证和validation.xml 中的验证,如果我评论 validate() 方法,则表单 validation.xml 验证正在工作,否则只有在 validate 方法中完成的验证才有效!

我正在粘贴下面涉及的代码摘录,请让我知道有价值的建议:

public class DvaUpdateBean extends ValidatorActionForm implements Serializable {

//getter setters

public ActionErrors validate(ActionMapping mapping,
        HttpServletRequest request) {
    ActionErrors errors = new ActionErrors();
    String method = request.getParameter("method");
    if (method == null){
        return errors;
    }

    if(method.equalsIgnoreCase("updateDvar")){
        if (getDescription() == null || getDescription().length() < 1) {
            errors.add("descreq", new ActionMessage("error.ps.descreq"));
        }

        if (getReason() == null || getReason().length() < 1) {
            errors
                    .add("reasonreqd", new ActionMessage(
                            "error.ps.reasonreqd"));
        }

        if( getInVoiceRadio() == null || getInVoiceRadio().length() < 1 ) {
            errors.add("invreq",new ActionMessage("error.dva.invreq"));
        }


        if ( getInVoiceRadio()!=null && getInVoiceRadio().equalsIgnoreCase("Y") &&  ( getInVoiceNumber()==null || getInVoiceNumber().length() < 1) ) {
            errors.add("invnumreq",new ActionMessage("error.dva.invnumreq"));
            //if ( getCrDate()!=null && getCrDate().length()<1) {
                //errors.add("condatereq", new ActionMessage("error.wlrr.condatereq"));
            //}
        }

        if ( getInVoiceRadio()!=null && getInVoiceRadio().equalsIgnoreCase("Y") &&  ( getInVoiceNumber()!=null || getInVoiceNumber().length() > 1) && ( getInVoiceDate()==null || getInVoiceDate().length()<1 ) ) {
            errors.add("invdatereq", new ActionMessage("error.dva.invdatereq"));
        }

        if ( getInVoiceRadio()!=null && getInVoiceRadio().equalsIgnoreCase("N") &&  ( ( getInVoiceNumber()!=null && getInVoiceNumber().length() > 1) || ( getInVoiceDate()!=null && getInVoiceDate().length()>1 ) ) ) {
            errors.add("invreqyn", new ActionMessage("error.dva.invreqyn"));
        }   
    }   

    return errors;
}

}

验证.xml

 <form-validation>
    <formset>
<form name="/dvaSearch">
        <field property="dvaSearchBean.dvasrNumber" depends="integer">
            <msg name="integer" key="label.invalidDvasrNumber" />
        </field>
        <field property="searchOriDate" depends="date">             
            <var><var-name>datePatternStrict</var-name><var-value>MM-dd-yyyy</var-value></var>
            <msg name="date" key="label.invalidOrignDate"/>
        </field>
    </form> 

</formset>
</form-validation>

Struts-config.xml

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames"
        value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>
4

1 回答 1

4

我遇到了同样的问题 ashwinsakthi。这是我解决它的方法。

注意:我的表单 bean 继承自 ValidatorForm 而不是 ValidatorActionForm 像您的代码一样。ValidatorActionForm 继承自 ValidatorForm 所以我认为它会起作用。

这个想法是从表单内部调用父验证方法。您将首先以这种方式从验证器框架中获得错误(如果有)。然后您继续以正常方式添加您自己的验证。

@Override
public ActionErrors validate(
        ActionMapping mapping,
        HttpServletRequest request) {

    // errors return from validator framework (validation.xml file rules)
    ActionErrors errors = super.validate(mapping, request); 

    // Now check other properties (outside of validation.xml)
    if(somefield == ""  ) {
        errors.add("example", new ActionMessage("some.resource.file.key"));
    }

    ... continue to validate your properties

    return errors;
    }

在我的 jsp 文件(我的表单所在的位置)中,我包含以下内容,以便在表单发布后显示所有错误:

<font color="red">
<html:errors/>
</font>

最后,这是我的 struts-config.xml 文件中的一个片段。

   <action 
        path="/hellotest"
        type="com.dan.HelloTestAction"
        name="helloTestForm"
        scope="request"
        input="/index.jsp"
        validate="true">
    <forward name="success" path="/result.jsp"/>
    <forward name="failure" path="/index.jsp"/>
   </action>

在我的测试中,我得到了您期望的预期结果。试试看。

于 2013-11-20T03:40:20.150 回答