Uploaded image for project: 'Struts 2'
  1. Struts 2
  2. WW-3827

Generated Javascript validation short-circuit one field, will short-circuit all the remaining fields.

VotersWatch issueWatchersLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Invalid
    • 2.2.1, 2.3.3
    • 2.3.14
    • XML Validators
    • None

    Description

      When you set up your validation.xml with short-circuit and use client-side validation by setting validate="true" in the s:form tag.

      if one of the field has a short-circuited field-validator, the remaining generated javascript validations will be short-circuited as well.

      For example, the following validation xml, if password has error, phone number will not be validate at all in the client-side.

      <field name="password">
          <field-validator type="requiredstring" short-circuit="true">
            <param name="trim">true</param>
            <message key="ERROR.REQUIRED_LOGIN_PASSWORD"/>
          </field-validator>
          <field-validator type="fieldexpression" short-circuit="true">
              <param name="expression">password==confirmPassword</param>
              <message key="ERROR.CONFIRM_PASSWORD"/>
          </field-validator>
          <field-validator type="stringlength">
            <param name="trim">true</param>
            <param name="minLength">6</param>
            <message key="ERROR.PASSWORD_TOO_SHORT"/>
          </field-validator>
        </field>
          
        <field name="phoneNumber">
          <field-validator type="requiredstring" short-circuit="true">
            <param name="trim">true</param>
            <message key="ERROR.REQUIRED_PHONE_NUMBER"/>
          </field-validator>
          <field-validator type="regex">
            <param name="trim">true</param>      
            <param name="expression"><![CDATA[^(\(?\d\d\d\)?)?( |-|\.)?\d\d\d( |-|\.)?\d{4,4}(( |-|\.)?[ext\.]+ ?\d+)?$]]></param>
            <message key="ERROR.INVALID_PHONE_NUMBER"/>
          </field-validator>
        </field>
      

      This seems to be caused but the continueValidation flag in the form-close-validate.ftl freemarker template.

      I've added a line in the template to reset the continueValidation flag at the start of each field:
      ... snip ...

      <#list parameters.tagNames as tagName>
          	<#-- Fix issue with short-circuit one field-validator will short-circuit field-validators of other field name as well -->
          	// field validators for tag, ${tagName}
          	continueValidation = true;  // reset flag, as we are starting a new field name.
          
              <#list tag.getValidators("${tagName}") as validator>
      

      ... snip ...

      Attachments

        Issue Links

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            lukaszlenart Lukasz Lenart
            jerome.chin Jerome Chin
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Slack

                Issue deployment