【问题标题】:Reusing Custom Expression Validator in Struts 2 [duplicate]在 Struts 2 中重用自定义表达式验证器 [重复]
【发布时间】:2015-03-18 07:07:06
【问题描述】:

在 Struts 2 中,我们可以开发@CustomValidator,它可以在应用程序范围内使用

@CustomValidator(type = "CustomerNumberValidator", fieldName = "customerNo")

为了验证更多,我们使用@ExpressionValidator

@ExpressionValidator(expression = 
"( (!''.equals(account.firstName) && (!''.equals(account.lastName) )
   || (presonalAccount == false)", 
   key = "validate.account.name")

如果表达式过于复杂,需要处理更多个字段,我们使用OGNL来调用静态方法。静态方法将进行验证并返回一个 boolean 例如

@ExpressionValidator(expression = "@foo.bar.CalendarUtil@compareDates(fromDate,toDate)", key = "validate.date.before")

以上是自定义表达式验证器的一些方法!

我们在应用程序范围内使用@foo.bar.CalendarUtil@compareDates 为我们进行此验证。

还有其他方法可以让我们使用自定义范围验证器吗?!

是否有任何自定义表达式验证器可以添加到 Struts 中,我们可以像使用 @CustomValidator 一样在 Action 中调用它?

【问题讨论】:

    标签: java validation struts2 struts-validation struts2-convention-plugin


    【解决方案1】:

    创建自定义验证器(与字段无关):

    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());
            }
        }
    }
    

    validators.xml 文件中注册自定义验证器:

    <?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>
    

    在操作中使用验证器:

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

    【讨论】:

    • 太好了,正是我想要的,请您更新您的答案并让我知道,在 i18n 应用程序中,我如何读取 compareDatesValidator 中的自定义消息密钥并将其设置为 addActionError
    • 这对我来说似乎是另一个问题,所以最好将它作为另一个问题发布(例如“如何从自定义验证器中获取 i18n 消息”)...
    • 好吧,我已经问过了:stackoverflow.com/questions/28054378/…
    【解决方案2】:

    如果您需要验证多个字段,您可以使用非字段自定义验证器。非字段自定义验证器应扩展 ValidatorSupport 并实现 validate 方法。然后在 -validation.xml 中应用自定义验证器或使用 @CustomValidator 注释。在那里,您可以将自定义表达式添加为 @ValidationParameter 并在您进行验证时对其进行解析。

    注意:

    我在this 回答:

    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());
      }
    }
    

    另一个选项是覆盖ActionSupport 类的validate 方法。对此方法的调用由validation interceptor 控制。这种验证方法称为 programmatic,默认情况下会使用该方法,而不管在 declarative 验证期间应用的验证器如何。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多