4

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 に追加できるカスタム式バリデーターはありますか?Action使用する方法で呼び出すことができます@CustomValidatorか?

4

2 に答える 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;
}
于 2015-01-20T10:45:41.213 に答える
1

複数のフィールドを検証する必要がある場合は、フィールド以外のカスタム バリデーターを使用できます。フィールド以外のカスタム バリデータは、メソッドを拡張ValidatorSupportして実装する必要がありますvalidate。次に、カスタム バリデーターを-validation.xmlor use@CustomValidatorアノテーションに適用します。そこにカスタム式を追加@ValidationParameterして、検証を行うときにそれらを解析できます。

ノート:

この回答で最初に使用したこの手法:

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このメソッドの呼び出しは、validationinterceptorを介して制御されます。この検証方法はプログラムによるものとして知られており、宣言型検証中に適用されるバリデーターに関係なく、デフォルトで使用されます。

于 2015-01-20T14:05:41.303 に答える