Edit on GitHub << back to Annotations

# Validations Annotation

If you want to use several annotations of the same type, these annotations must be nested within the `@Validations()` annotation.

## Usage

Used at METHOD level.

## Parameters

Parameter | Required | Notes
--- | --- | ---
requiredFields | no | Add list of RequiredFieldValidators
customValidators | no | Add list of CustomValidators
conversionErrorFields | no | Add list of ConversionErrorFieldValidators
dateRangeFields | no | Add list of DateRangeFieldValidators
emails | no | Add list of EmailValidators
fieldExpressions | no | Add list of FieldExpressionValidators
intRangeFields | no | Add list of IntRangeFieldValidators
requiredStrings | no | Add list of RequiredStringValidators
stringLengthFields | no | Add list of StringLengthFieldValidators
urls | no | Add list of UrlValidators
visitorFields | no | Add list of VisitorFieldValidators
regexFields | no | Add list of RegexFieldValidator
expressions | no | Add list of ExpressionValidator

## Examples

     @Validations(
               requiredFields =
                       {@RequiredFieldValidator(type = ValidatorType.SIMPLE, fieldName = "customfield", message = "You must enter a value for field.")},
               requiredStrings =
                       {@RequiredStringValidator(type = ValidatorType.SIMPLE, fieldName = "stringisrequired", message = "You must enter a value for string.")},
               emails =
                       { @EmailValidator(type = ValidatorType.SIMPLE, fieldName = "emailaddress", message = "You must enter a value for email.")},
               urls =
                       { @UrlValidator(type = ValidatorType.SIMPLE, fieldName = "hreflocation", message = "You must enter a value for email.")},
               stringLengthFields =
                       {@StringLengthFieldValidator(type = ValidatorType.SIMPLE, trim = true, minLength="10" , maxLength = "12", fieldName = "needstringlength", message = "You must enter a stringlength.")},
               intRangeFields =
                       { @IntRangeFieldValidator(type = ValidatorType.SIMPLE, fieldName = "intfield", min = "6", max = "10", message = "bar must be between ${min} and ${max}, current value is ${bar}.")},
               longRangeFields =
                       { @LongRangeFieldValidator(type = ValidatorType.SIMPLE, fieldName = "intfield", min = "6", max = "10", message = "bar must be between ${min} and ${max}, current value is ${bar}.")},
               shortRangeFields =
                       { @ShortRangeFieldValidator(type = ValidatorType.SIMPLE, fieldName = "shortfield", min = "1", max = "128", message = "bar must be between ${min} and ${max}, current value is ${bar}.")},
               dateRangeFields =
                       {@DateRangeFieldValidator(type = ValidatorType.SIMPLE, fieldName = "datefield", min = "-1", max = "99", message = "bar must be between ${min} and ${max}, current value is ${bar}.")},
               expressions = {
                   @ExpressionValidator(expression = "foo > 1", message = "Foo must be greater than Bar 1. Foo = ${foo}, Bar = ${bar}."),
                   @ExpressionValidator(expression = "foo > 2", message = "Foo must be greater than Bar 2. Foo = ${foo}, Bar = ${bar}."),
                   @ExpressionValidator(expression = "foo > 3", message = "Foo must be greater than Bar 3. Foo = ${foo}, Bar = ${bar}."),
                   @ExpressionValidator(expression = "foo > 4", message = "Foo must be greater than Bar 4. Foo = ${foo}, Bar = ${bar}."),
                   @ExpressionValidator(expression = "foo > 5", message = "Foo must be greater than Bar 5. Foo = ${foo}, Bar = ${bar}.")
       }
       )
       public String execute() throws Exception {
           return SUCCESS;
       }

## Different validations per method

Different validations per method is NOT supported for client-side validation!

To use different validations per method, the `validateAnnotatedMethodOnly` property must be set on the validation interceptor.

    <interceptor-ref name="validation">
      <param name="validateAnnotatedMethodOnly">true</param>
      <param name="excludeMethods">input,back,cancel,browse</param>
    </interceptor-ref>

Here’s a complete example of updating the default stack:

      <package name="default" extends="struts-default">
        <interceptors>
          <interceptor-stack name="content">
            <interceptor-ref name="exception"/>
                    <interceptor-ref name="alias"/>
                    <interceptor-ref name="servletConfig"/>
                    <interceptor-ref name="prepare"/>
                    <interceptor-ref name="i18n"/>
                    <interceptor-ref name="chain"/>
                    <interceptor-ref name="debugging"/>
                    <interceptor-ref name="profiling"/>
                    <interceptor-ref name="scopedModelDriven"/>
                    <interceptor-ref name="modelDriven"/>
                    <interceptor-ref name="actionFileUpload"/>
                    <interceptor-ref name="checkbox"/>
                    <interceptor-ref name="staticParams"/>
                    <interceptor-ref name="params">
                      <param name="excludeParams">dojo\..*</param>
                    </interceptor-ref>
                    <interceptor-ref name="conversionError"/>
                    <interceptor-ref name="validation">
      	            <param name="validateAnnotatedMethodOnly">true</param>
                        <param name="excludeMethods">input,back,cancel,browse</param>
                    </interceptor-ref>
                    <interceptor-ref name="workflow">
                        <param name="excludeMethods">input,back,cancel,browse</param>
                    </interceptor-ref>
          </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="default"/>
      </package>
    </struts>