Mule SDK のバリデーター

バリデーターとは、メッセージを変更することなく Mule メッセージを検証する操作です。バリデーターでは次の効果をもたらすことができます。

  • バリデーターで課された条件が満たされた場合、フローは続行し、Mule メッセージは変更されません。

  • バリデーターで課された条件が満たされない場合、エラーがスローされます。

バリデーターの要件は?

バリデーターになるには、操作は次の要件を満たす必要があります。

  • @Validator​ アノテーションによって到達される必要があります。クラスレベルまたはメソッドレベルで割り当てることができます。​@Validator​ アノテーションをクラスレベルで使用すると、すべての公開メソッドがバリデーターとしてマークされます。

  • void​ を返す必要があります。

  • MULE:VALIDATION​ (またはこの拡張) である 1 つ以上のエラーをスローする必要があります。検証に失敗した場合、バリデーターは Mule 検証エラーまたはその子をスローする必要があります。

@Validator​ アノテーション付きのメソッドはステレオタイプ ​ValidatorStereotype​ に属します。コンポーネントは 2 つのステレオタイプを持つことができないため、複数のステレオタイプをメソッドに割り当てることはできません。

バリデーターは、操作と同じ UX を共有します。Studio で使用するモジュールを追加すると、バリデーターがパレットに表示されます。バリデーターをフローに追加すると、そのパラメーターは操作の場合と同様に割り当てられます。

バリデーターの作成方法

次の例では、単純なバリデーターを作成する方法を示します。これは、​balance​ という名前の単純な拡張機能を作成します。

@Operations({BalanceOperations.class})
@Extension(name = "balance")
@ErrorTypes(BalanceError.class)
public class BalanceExtension {

}

以下の ​BalanceOperations​ クラスは、​@Validator​ アノテーションが付加された検証メソッドを追加します。このメソッドは、汎用的な検証エラー種別から取得するエラー種別をスローします。​BalanceOperations​ クラスに ​@Validator​ アノテーションを付加することもできますが、これを行うと、その中の他の操作がバリデーターとしてフラグ付けされます。

public class BalanceOperations {
  @Validator
  @Throws(BalanceErrorsProvider.class)
  public void hasSufficientFunds(Integer balance, Integer price) throws Exception {
    if (price > balance){
      throw new ModuleException(BalanceError.INSUFFICIENT_FUNDS, new IllegalArgumentException("There is not enough money to make the transaction"));
    }
  }
}

次の例では、検証が失敗した場合にスローするエラーを作成します。これには検証の失敗に応じた名前が付いています。

public enum BalanceError implements ErrorTypeDefinition<BalanceError> {
  INSUFFICIENT_FUNDS(MuleErrors.VALIDATION);

  private ErrorTypeDefinition<? extends Enum<?>> parent;

  BalanceError(ErrorTypeDefinition<? extends Enum<?>> parent) {
    this.parent = parent;
  }

  @Override
  public Optional<ErrorTypeDefinition<? extends Enum<?>>> getParent() {
    return Optional.ofNullable(parent);
  }
}

バリデーターのメソッドには、検証がスローできるすべてのエラー種別を認識する ​ErrorTypeProvider​ が必要です。この例では、メソッドがスローできるエラーの種別は ​BALANCE:INSUFFICIENT_FUNDS​ のみであることを指定する ​ErrorTypeProvider​ を作成します。

public class BalanceErrorsProvider implements ErrorTypeProvider {
  @Override
  public Set<ErrorTypeDefinition> getErrorTypes() {
    HashSet<ErrorTypeDefinition> errors = new HashSet<>();
    errors.add(BalanceError.INSUFFICIENT_FUNDS);
    return errors;
  }
}

バリデーターの使用方法

上記で作成したバリデーターをフローで使用するとします。構文は操作の場合と同じです。​balance​ と ​price​ は必須パラメーターのため、これらを割り当てる必要があります。この場合、変数 ​price​ と ​balance​ の値を使用して検証が実行されますが、ここでは任意の式を使用できます。

<balance:has-sufficient-funds balance="#[vars.balance]" price="#[vars.price]"/>

バリデーターおよび「all」スコープ

バリデーターはステレオタイプ ​ValidatorStereotype​ のため、検証モジュールから ​all​ スコープでバリデーターを使用できます。

次の例では、検証モジュールからバリデーターを使用します。また、これは、値が実際に正であるかどうかを検証する、​isPositive​ という名前のバリデーターを持つ数値拡張があることを想定します。

<validation:all>
  <validation:is-not-blank-string value="#[vars.buyerName]"/>
  <number:is-positive value="#[vars.price]"/>
  <number:is-positive value="#[vars.balance]"/>
  <balance:has-sufficient-funds balance="#[vars.balance]" price="#[vars.price]"/>
</validation:all>

この例では、空の文字列ではない ​buyerName​ 変数があることを確認します。その後、​price​ と ​balance​ の両方の変数に正の値が含まれていることを確認します。最後にバリデーターを使用して口座に十分な残高があるかどうかを確認します。