S2Dxo ConversionRuleのtips

2008/02/20

S2DxoのConversionRuleのあれこれ。
OGNLが分かれば、けっこういろんな変換ができちゃいそう。

先に、変換元クラスと変換先クラスを示しておきます。
S2Dxoクイックスタートを真似るとすぐに試すことができると思います。

変換元クラス(Employee)
便宜上、定数LUCKY_NUMBERとユーティリティメソッドformatId()も入れています。
public class Employee {
    private long id;
    private String name;
    public static long LUCKY_NUMBER = 777;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static String formatId(long id) {
        return String.format("%08d", id);
    }
}


変換先クラス(EmployeePage)

public class EmployeePage {
    private String empId;
    private String name;


    public String getEmpId() {
        return empId;
    }

    public void setEmpId(String empId) {
        this.empId = empId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


プロパティ名の差異の吸収

id→empIdのように、変換元と変換先のプロパティ名が異なる場合は、
@ConversionRule("変換先プロパティ名 : 変換後プロパティ名")
のようにアノテーションをつけることで、プロパティ名の差異が吸収できる。
public interface EmployeeDxo {
    @ConversionRule("empId : id")
    EmployeePage convert(Employee employee);
}


変換に条件をつける

nameがnullの場合にはnameを空文字にしてあげる、といった条件をつけるには、以下のようにOGNL式で3項演算子を記述する。
このような場合、empIdもシングルクオートで囲まなければならないことに注意。
    @ConversionRule("'empId' : id, 'name' : name != null ? name : ''")
    EmployeePage convert(Employee employee);


変換ルールに定数をつかう

(なさけない例で申し訳ないが)idがEmployee#LUCKY_NUMBERと一致していたら、nameに「様」をつけるという変換をやるには、以下のように@で定数をもつクラスを囲んで記述する。
    @ConversionRule("'empId' : id," +
                    "'name' : id == @xxx.dxo." +
                    "Employee@LUCKY_NUMBER ? name+'様' : name"
)
    EmployeePage convert(Employee employee);


変換ルールにstaticメソッドをつかう

idを8桁にフォーマットして変換先へ入れるといった場合など、メソッドを経由して変換したい場合は以下のように、@クラスの完全修飾名@メソッド名(・・・)で。
メソッドの引数が1つだとうまくいくんですが、2つとかになるとうまくいきませんでしたx_x
OGNLの書き方なのだろうか。。わからなかったのであきらめました。。

2008/05/02 今日やったら全然問題なくうまくいきました。

    @ConversionRule("'empId' : @xxx.dxo.Employee@formatId(id), " +
                    "'name' : name")
    EmployeePage convertWithFormat(Employee employee);


2008/11/13 追記
インナークラスのstaticメソッドを使う場合は、@クラスの完全修飾名$インナークラス名@メソッド名(・・・)で。
クラスファイルのようなイメージですな。

OGNL

が、なんだかキモみたいですね。いまいち理解しきれませんが。。
リファレンスは以下にあります。
OGNLガイド
OGNL Language Reference

Java | コメント(0) | トラックバック(0)
トラックバック
トラックバックURL:
コメントをどうぞ
名前 (入力しなければ「通りすがり」):

メールアドレス (入力しても公開されません):

URL (入力すればリンクが張られます):


コメント:

(コメントにタグなどを使ってもタグがそのままが表示されます)