クラスのインスタンスのテスト - Mule 4

Java Module には、オブジェクトがクラスのインスタンスかどうかをテストする ​Validate type​ 操作があります。この操作は、クラスのサブタイプを受け入れるか拒否するように設定することもできます。​true​ の場合、操作はペイロードを変更せず、フローは実行を続行します。それ以外の場合、操作はエラーをスローしてフローを中断し、制御を​エラーハンドラー​に渡します。

Validate Type 操作

この例は、​Person​ クラスを定義します。

package com.me;

public class Person {

    private String name;
    private Integer age;

    public Person() {
        this.name = "Max Mule";
        this.age = 10;
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

この例は、​Person​ クラスを拡張する ​Employee​ クラスを定義します。

package com.me;

public class Employee extends Person {

    private String company;

    public Employee(String name, Integer age, String company) {
        super(name, age);
        this.company = company;
    }
}

Java Module で使用するクラスはエクスポートする必要があります (デフォルトパッケージに属していない場合)。エクスポートしないと、実行に失敗し、JAVA:CLASS_NOT_FOUND​ エラーが表示されます。​「リソースのエクスポート方法」​を参照してください。

オブジェクトが特定のクラスに属しているかどうかを確認するには、オブジェクトのインスタンスが必要です。 そのためには、​new​ 操作​をコールして ​Employee​ オブジェクトを作成し、​jane​ 変数内に置きます。

<java:new class="com.me.Employee"
    constructor="Employee(String, Integer, String)"
    target="jane">
    <java:args>#[{
      name: 'Jane Avi',
      age: 28,
      company: MuleSoft
    }]</java:args>
</java:new>

オブジェクトが ​Employee​ クラスに属する ​vars.jane​ に保存されているかどうかを確認するには、​Validate type​ 操作を使用します。

<java:validate-type class="com.me.Employee" instance="#[vars.jane]" />

この場合、オブジェクトは ​Employee​ のインスタンスであるため、フローは通常どおり実行を続行し、ペイロードは変更されません。

サブタイプ (継承) の確認

Validate type​ 操作には ​Accept subtypes​ パラメーターがあります。このパラメーターは、操作がクラスのすべてのサブクラスを受け入れるかどうかを示します。 このパラメーターには ​true​、​false​、または式を指定可能で、省略した場合はデフォルトで ​true​ になります。

引き続き前記の例を使用すると、​vars.jane​ 内のオブジェクトは ​Person​ クラスを拡張する ​Employee​ クラスに属します。つまり、​Employee​ は ​Person​ のサブタイプになります。そのため、この例を実行すると ​true​ に解決され、フローは通常どおり実行されます。

<java:validate-type
    class="com.me.Person"
    instance="#[vars.jane]"
    acceptSubtypes="true" />
Accept subtypes​ パラメーターを省略すると、この値はデフォルトで ​true​ になります。

前のコードは次と同等です。

<java:validate-type
    class="com.me.Person"
    instance="#[vars.jane]" />

ただし、​Accept subtypes​ を ​false​ に設定するとします。

<java:validate-type
    class="com.me.Person"
    instance="#[vars.jane]"
    acceptSubtypes="false" />

実行中、操作はエラーをスローしてフローを中断し、制御を​エラーハンドラー​に渡します。

DataWeave での Validate Type 関数

この例では、Java Module で、オブジェクトがクラスのインスタンスの場合に ​true​ または ​false​ を返す DataWeave ​isInstanceOf()​ 関数を提供します。​Validate type​ 操作とは異なり、​false​ に評価されたときにエラーはスローされません。

<choice>
    <when expression="#[Java::isInstanceOf(vars.jane, com.me.Employee)]">
        <flow-ref name="routeToCompany" />
    </when>
</choice>