如何将Grails域类属性映射到不匹配的json字符串?

时间:2014-07-15 16:05:31

标签: grails groovy gorm

是否有内置/简单的方法来设置域类属性和没有与属性名称完全匹配的JSON字符串之间的映射?

例如,当我有域类时:

class Person {
    String jobTitle
    String favoriteColor
    static constraints = {
        jobTitle(blank: false)
        favoriteColor(blank: false)
    }
}

有人给了我以下JSON:

{ "currentJob" : "secret agent", "the-color" : "red" }

我希望能够做到这一点:

new Person(request.JSON).save()

在groovy / grails中有没有办法让我映射currentJob - > jobTitle和the-color - >最喜欢的颜色?

修改

我做了一点实验,但我还没有完成它。但我发现了一些有趣的事情......

起初我尝试覆盖setProperty方法:

@Override
setProperty(String name, Object value) {
    if(this.hasProperty(name)) this[name] = value
    else {
        switch(name) {
            'currentJob': this.jobTitle = value; break;
            'the-color': this.favoriteColor = value; break;
        }
    }
}

但是这不起作用有两个原因:1)只有当一个属性与name匹配时才调用setProperty 2)“this [name] = value”调用setProperty,导致无限递归循环。

然后我想,好吧搞砸了,我知道传入的json字符串是什么样的(如果我只能控制它),我就会摆脱处理名称匹配的场景的行,而我ll覆盖hasProperty,也许这将起作用:

@Override
void setProperty(String name, Object value) {
    switch(name) {
        'currentJob': this.jobTitle = value; break;
        'the-color': this.favoriteColor = value; break;
    }
}
@Override
boolean hasProperty(String name) {
    if(name == "currentJob" || name == "the-color") return true
    return false
}

但不,那也不起作用。通过随机的运气我发现,我不仅要覆盖hasProperty(),而且还必须为该属性设置一个空的setter。

void setCurrentJob(){ }

该hack适用于currentJob - 我想只有当hasProperty返回true并且该属性有一个setter时才会调用setProperty(即使该setter是在grails的封面下自动生成的)。不幸的是,由于短划线我无法创建“setThe-Color”功能,所以这个解决方案对我不起作用。

仍然坚持这一点,任何帮助肯定会受到赞赏。

修改

覆盖void propertyMissing(String name,Object value){}方法由此调用:

Person person = new Person()
person["currentJob"] = "programmer"
person["the-color"] = "red"

但不是这样:

Person person = new Person(["currentJob":"programmer", "the-color":"red"])

0 个答案:

没有答案
相关问题