23

オブジェクトのインスタンス化中にマップ内の余分な属性を groovy に無視させる方法はありますか? 例:

class Banana{
    String name
}
def params = [name:'someGuy', age:13]
new Banana(params)

この例では、groovy は No such property: age 例外をスローします (明らかに、Banana クラスで age が定義されていないためです。必要な属性のみをマップから Banana クラスのコンストラクターに手動でマッピングすることに頼ることなく、方法はありますか? Banana に余分な属性を無視するように指示するには?

Grails ドメイン クラスではこの問題が発生しないことに気付きました。ここでも同じ動作が必要です。

あなたの助けとアドバイスをありがとう!

4

4 に答える 4

13

残念ながら、Groovy でこれを行う組み込みの方法はありません。Grails は、ドメイン オブジェクトの独自のコンストラクターを生成することによってこれを行います。簡単な回避策は、次のようなコンストラクターを使用することです。

Banana(Map map) {
    metaClass.setProperties(this, map.findAll { key, value -> this.hasProperty(key) })
}
于 2012-04-17T17:18:44.313 に答える
2

すべてのプロパティが存在する場合にパフォーマンスに影響を与えない別の方法:

public static Banana valueOf(Map<String, Object> params) {
    try {
        return new Banana(source)
    } catch (MissingPropertyException e) {
        log.info(e.getMessage())
        source.remove(e.property)
        return valueOf(source)
    }
}
于 2013-09-17T09:51:34.480 に答える