setAttributeメソッドへの検証コードの記述

特定の検証メソッドを編集し、ビジネス・ロジックを指定できます。まず、エンティティ・オブジェクト・ウィザードを使用し、エンティティ・オブジェクトにメソッドを追加します。属性レベルの規則を作成するには、ウィザードを使用してエンティティ・オブジェクトにアクセッサ・メソッドを追加します。アクセッサ・メソッドの一般的な名前は、getAttribute またはsetAttribute です。ここで、Attribute はエンティティの属性の名前に置き換えます。

Business Components for Javaフレームワークにより、これらのメソッドのシグネチャが定義され、スケルトン・コードが生成されます。これに、検証ロジックを実装するコードを追加します。たとえば、Empエンティティ・オブジェクトの場合、フレームワークでは、Sal属性を検証するためのsetSalメソッドを生成します。

属性レベルの検証コードを作成するには、エンティティ・オブジェクトのsetAttribute メソッドを編集します(エンティティ・オブジェクト・ウィザードを使用し、スケルトンを生成します)。デフォルトでは、スケルトン・メソッドにはEntity.setAttributeInternalへのコールが含まれます。このコールの前にカスタム検証コードを挿入します。

たとえば、Customerエンティティ・オブジェクトに、顧客のクレジット・カード番号を表すcreditCardNumberという名前の属性があるとします。番号を検証するために、次のコードにより合計桁数が計算され、指定した値と桁数が比較されます。合計がその値より小さい場合は、メソッドにより例外がスローされます。それ以外の場合、カード番号は有効であるため、setAttributeInternalがコールされ、検証プロセスが続行されます。

public class Customer extends oracle.jbo.rt.Entity {

...

  public void setCreditCardNumber(String cardNo) {
    int checkSum = 0;

    // Minimum value chosen arbitrarily for this example.
    int MIN_VAL = 100;   

    // Assume the following card number format:
    // "1234567890123456"
    for (int i = 0; i < cardNo.length(); i++) {
      checkSum += Integer.parseInt(cardNo.substring(i, i + 1));
    }


    if (checkSum < MIN_VAL) {
      throw new JboException("Invalid card number");
    }

    // Continue the validation process.
    // Generated calls follow.
    setAttributeInternal(CREDTICARDNUMBER, cardNo)
    }

...
}

次のメソッドの例では、配布IDの設定前に一意のキー値が必要であるという規則が実行されます。値が一意でない場合、メソッドにより例外がスローされます。それ以外の場合は、検証プロセスが続行されます。


public void setDistributionId(Number quantity)  {
  Object[] reqDistKey = new Object[1];
  reqDistKey[0] = this.distId;

  // If the key exists, then it's not unique.
  if (getDefinitionObject()
    .findInstance((ApplicationModuleImpl)getApplicationModule(),
    new Key(reqDistKey)) != null ){
	  throw new JboException("Must be unique");
  }
  // Generated calls follow.
  setAttributeInternal( DISTRIBUTIONID, quantity );
}

関連項目
検証ロジックの追加方法