Java クラスの型の再利用

Java クラスを読み込む場合、​java!​ プレフィックスがあるインポートディレクティブを使用します。プレフィックス ​java!​ では、Java Module ローダーを使用するように DataWeave に指示します。モジュールが読み込まれたら、コンストラクター、変数、関数をコールできます (DataWeave を使用した Java メソッドのコールを参照)。また、クラス型を使用することもできます。DataWeave は、​Class​ という型名で Java クラスの型を公開します。

Java クラスは、​「Java 値のマッピング」​にリストされている DataWeave 型にマップされます。 表で指定されていない Java クラスは、DataWeave で ​JavaBean​ として処理され、DataWeave の ​Object​ 型にマップされます。そのオブジェクトのキーは Java クラスのプロパティの名前と一致し、それらの値はプロパティクラスと一致する DataWeave 型に対応します。次の例は、DataWeave が Java getter からすべてのプロパティを取得する方法を示しています。

Product クラス:

package org.mycompany;


public class Product {
    private String name;
    private int price;

    public Product(String name, int price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public int getPrice() {return price;}
    public void setPrice(int price) {this.price = price;}
}

この Java クラスの型を読み込むと、次の DataWeave 型の宣言と同じ効果があります。

type Class = { name?: String | Null, price?: Number | Null }

次の例は、型 ​Product::Class​ を DataWeave のその他の型として使用します。関数 ​Product::new​ をコールして (これにより、Java クラスのコンストラクターがコールされる)、DataWeave オブジェクトを作成しても、型 ​Product::Class​ と同じ効果があります。 インポートディレクティブには ​from​ がなく、代わりに型 ​Class​ のプレフィックス ​Product::​ を使用しています。このプレフィックスにより、型をより宣言的な使用が可能になり、インポートされる他の ​Class​ 型との競合を回避できます。

DataWeave スクリプト:
%dw 2.0
output json
import java!org::mycompany::Product

var aBook: Product::Class = {name: "Learn DW", price: 123}
fun description(p: Product::Class) = "The product: $(p.name), costs: $(p.price)"

type Order = {
    product: Product::Class,
    date: LocalDateTime
}
---
{
    a: Product::new("DW lang", 321) is Product::Class,
    b: description(aBook),
    c: {product: aBook, date: |2022-12-18T14:00:00|} is Order
}
出力:
{
    a: true,
    b: "The product: Learn DW, costs: 123",
    c: true
}