在 Struts 2 中重用自定义表达式验证器[重复]

问题描述 投票:0回答:2

在Struts 2中我们可以开发

@CustomValidator
,可以广泛使用:

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

为了验证多个,我们使用

@ExpressionValidator

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

如果表达式太复杂并且需要处理多个多个字段,我们使用 OGNL 来调用

static
方法。
static
方法将进行验证并返回
boolean
例如

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

以上是自定义表达式验证器的工作原理!

我们在应用程序范围内使用

@foo.bar.CalendarUtil@compareDates
来为我们进行验证。

还有另一种方法可以让我们使用自定义表达式验证器吗?!

有没有可以添加到Struts中的自定义表达式验证器,我们可以像使用

Action
一样在
@CustomValidator
中调用它?

java validation struts2 struts-validation struts2-convention-plugin
2个回答
4
投票

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

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

1
投票

如果需要验证多个字段,可以使用非字段自定义验证器。非字段自定义验证器应扩展

ValidatorSupport
并实现
validate
方法。然后在您的
-validation.xml
中应用自定义验证器或使用
@CustomValidator
注释。在那里,您可以添加自定义表达式作为
@ValidationParameter
并在进行验证时解析它们。

注:

我在this答案中使用了first

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

另一种选择是重写

validate
类的
ActionSupport
方法。该方法的调用是通过
validation
拦截器
控制的。这种验证方法称为“程序化”,默认情况下使用“声明式”验证期间应用的验证器。
© www.soinside.com 2019 - 2024. All rights reserved.