カスタムValidator Beanの実装

Javaフレームワーク開発者は、独自のXML Validator Beanを作成できます。ビジネス・コンポーネント・フレームワークでは、スケルトン・クラスが提供され、検証クラスを実装するコードを追加できます。

スケルトン・クラスを生成するには、次のようにします。

  1. ナビゲータで、ビジネス・コンポーネントのプロジェクト・ファイルを右クリックして「編集」を選択すると、ビジネス・コンポーネント・プロジェクト・ウィザードが表示されます。
  2. 「登録済の規則」タブで「新規」をクリックして、新規検証規則クラスを表示します。フィールドに必要事項を入力し、クラスに適切なオプションを選択します。
  3. 「OK」をクリックして新規検証規則クラスを閉じ、「終了」をクリックしてビジネス・コンポーネント・プロジェクト・ウィザードを終了します。

スケルトン・クラスに、検証クラスを実装するコードを追加します。

検証クラスを実装するには、次のようにします。

ナビゲータで、新規のスケルトン・クラスをダブルクリックし、コード・エディタで開きます。

クラスを実装した後、エンティティ・オブジェクト・ウィザードでクラスにアクセスできるよう変更する必要があります。

  1. ナビゲータで、クラスを右クリックして「メイク」を選択します。
  2. JDeveloperを終了します。
  3. <JDev_install>/jdev/bin/jdev.confに移動し、次のエントリを追加します。
    AddJavaLibPath ..\myclasses
  4.   jdev.confを保存します。
  5. JDeveloperを再起動します。

 

検証クラスでは、vetoableChangeおよびvalidateValueという2つの主なメソッドを提供するJbiValidatorインタフェースを実装する必要があります。ビジネス・コンポーネント・フレームワークでは、属性値が設定される場合、vetoableChangeがコールされ、PropertyChangeEventに渡されます。通常は、validateValueをコールするためにvetoableChangeを実装します。validateValueがfalseを返した場合、vetoableChangeにより、失敗した内容に関する情報とともに例外がスローされます。validateValueの実装で、(ValidationExceptionを拡張する必要がある)独自の例外をスローすることもできます。例外を使用したプログラミングの詳細は、「ビジネス・コンポーネント・アプリケーションにおけるエラー処理方法」を参照してください。

 

次のコードでは、DemoCardValidatorという名前の検証クラスが実装されます。validateValueで、ビジネス・コンポーネントのビルトインの規則では定義できない、複雑なビジネス・ロジックが実装されます。コンパイル後、このクラスを使用してValidatorタイプを作成し、次にエンティティ・オブジェクト(たとえば、CustomerエンティティのCreditCardNumber属性)に適用できます。


package d2e;
import oracle.jbo.server.rules.JbiValidator;
import oracle.jbo.server.util.VetoableChangeListener;
import oracle.jbo.server.util.PropertyChangeEvent;

import oracle.jbo.server.ValidationException;


public class DemoCardValidator implements JbiValidator {


  private String description = " Verifies a credit card number. ";
  private final int mMinValue = 100; // Arbitrary value for demo.

  /**
    * Return true if value is valid
    */

  public boolean validateValue(Object value) {
      // Validates a credit card number by comparing the
      // sum of the digits to mMinValue, defined above.
    int checkSum = 0;
      // Assume the following card number format:
      // "1234567890123456"
    String cardNo = value.toString();
      for (int i = 0; i < cardNo.length(); i++) {
        checkSum += Integer.parseInt(cardNo.substring(i, i + 1));
      }
      return (checkSum > mMinValue) ? true : false;
    }

  /**
    * Invoked by framework for validation
    */

  public void vetoableChange(PropertyChangeEvent pce)
    throws ValidationException {
    Object newValue = (pce.getNewValue());
    if (!validateValue(newValue)) {
      Object objs[] = new Object[2];
      objs[0] = pce.getPropertyName() + this.getDescription();
      objs[1] = newValue;
      String errCode = "001";
      ValidationException ve = new ValidationException(errCode, objs);
      throw ve;
    }
  }

  /**
    * Description of what this class validates
    */

  public String getDescription() {
    return description;
  }

  /**
    * Description of what this class validates
    */

  public void setDescription(String str) {
    description = str;
  }

}