Java 在Struts 2中重用自定义表达式验证器

Java 在Struts 2中重用自定义表达式验证器,java,validation,struts2,struts-validation,struts2-convention-plugin,Java,Validation,Struts2,Struts Validation,Struts2 Convention Plugin,在Struts 2中,我们可以开发@CustomValidator,它可以在应用程序范围内使用 @CustomValidator(type = "CustomerNumberValidator", fieldName = "customerNo") 对于验证多个字段,我们使用@ExpressionValidator @ExpressionValidator(expression = "( (!''.equals(account.firstNa

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

@CustomValidator(type = "CustomerNumberValidator", fieldName = "customerNo")
对于验证多个字段,我们使用
@ExpressionValidator

@ExpressionValidator(expression = 
"( (!''.equals(account.firstName) && (!''.equals(account.lastName) )
   || (presonalAccount == false)", 
   key = "validate.account.name")
如果表达式太复杂,需要处理多个字段,则使用OGNL调用静态方法。例如,静态方法将执行验证并返回一个
布尔值

@ExpressionValidator(expression = "@foo.bar.CalendarUtil@compareDates(fromDate,toDate)", key = "validate.date.before")
以上是一些如何自定义表达式验证器

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

有没有其他方法可以让我们使用自定义范围的验证器

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

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

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


在操作中使用验证器:

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

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

注意:

这是我在回答问题时首先使用的技巧:


另一个选项是重写
ActionSupport
类的
validate
方法。对该方法的调用是通过控制的。这种验证方法被称为编程验证,默认情况下使用,无论声明性验证期间应用了什么验证程序。

太好了,正是我想要的,请在i18n应用程序中更新您的答案并让我知道,如何读取
compareDatesValidator
中的自定义消息键,并在
addActionError
中设置它对我来说似乎是另一个问题,因此最好将其作为另一个问题发布(如“如何从自定义验证器中获取i18n消息”)……好吧,我已在以下位置进行了询问:
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;
}
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());
  }
}