Flex Gateway新着情報
Governance新着情報
Monitoring API Managerバリデーターとは、メッセージを変更することなく 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]"/>
バリデーターはステレオタイプ 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
の両方の変数に正の値が含まれていることを確認します。最後にバリデーターを使用して口座に十分な残高があるかどうかを確認します。