Struts 2 - reusing Custom Expression Validator

前端 未结 2 1228
误落风尘
误落风尘 2020-12-10 20:32

In struts 2 we can develop @CustomValidator which can be used in application wide

@CustomValidator(type = \"CustomerNumberValidator\", fieldNam         


        
相关标签:
2条回答
  • 2020-12-10 21:12

    Create a Custom Validator (not field related):

    public final class CompareDatesValidator extends ValidatorSupport {
        private String fromDate; // getter and setter
        private String toDate;   // getter and setter    
    
        @Override
        public void validate(Object o) throws ValidationException {
            Date d1 = (Date)parse(fromDate, Date.class);
            Date d2 = (Date)parse(toDate, Date.class);
    
            if (d1==null || d2==null || d2.before(d1)){
                addActionError(getDefaultMessage());
            }
        }
    }
    

    Register the custom validator in validators.xml file:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE validators PUBLIC
         "-//OpenSymphony Group//XWork Validator Config 1.0//EN"
         "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">
    <validators>
        <validator name="compareDatesValidator" 
                  class="org.foo.bar.CompareDatesValidator"/>
    </validators>
    

    Use the validator in an action:

    private Date startDate; // getter and setter
    private Date endDate;   // getter and setter
    
    @Validations(
        customValidators={
            @CustomValidator(type="compareDatesValidator", 
                message="Dates provided are not valid."
                parameters={
                    @ValidationParameter(name="fromDate", value="${startDate}"), 
                    @ValidationParameter(name="toDate",   value="${endDate}")})})
    public String execute(){
        return SUCCESS;
    }
    
    0 讨论(0)
  • You can use non-field custom validator if you need to validate several fields. Non-field custom validator should extend ValidatorSupport and implement validate method. Then apply a custom validator in your -validation.xml or use @CustomValidator annotation. There you can add custom expressions as @ValidationParameter and parse them when you doing validation. Note, that this technique I used firstly in this answer:

    public class RetypeValidator extends ValidatorSupport {
    
      private String value = null;
    
      public String getValue() {
        return value;
      }
      public void setValue(String value) {
        this.value = value;
      }
    
      private String retypeValue = null;
    
      public String getRetypeValue() {
        return retypeValue;
      }
    
      public void setRetypeValue(String value) {
        retypeValue = value;
      }
    
      @Override
      public void validate(Object object) throws ValidationException {
        String value = (String) parse(this.value, String.class);
        String retypeValue = (String) parse(this.retypeValue, String.class);
        if (value != null && retypeValue != null && !value.equals(retypeValue))
          addActionError(getDefaultMessage());
      }
    }
    

    Another option is to override validate method of the ActionSupport class. The call to this method is controlled via validation interceptor. This method of validation is known as programmatic and is used by default regardless of validators applied during declarative validation.

    0 讨论(0)
提交回复
热议问题