Grails命令对象中的可选可空字段

时间:2017-11-01 02:17:41

标签: grails

如果我有这样的域类:

class Person {
    String phoneNumber
    Book favoriteBook

    static constraints = {
        phoneNumber nullable: false // you must have a phone number
        favoriteBook nullable: true // it is not necessary to have a favorite book
    }
}

在这种情况下,一个人不需要有喜欢的书。

我想创建一个允许用户更新其信息的命令对象。

class PersonUpdate {
    String phoneNumber
    Book favoriteBook

    static constraints = {
        phoneNumber nullable: false
        favoriteBook nullable: true
    }
}

def updatePerson(PersonUpdate cmd) {
    Person person = ...
    person.phoneNumber = cmd.phoneNumber
    person.favoriteBook = cmd.favoriteBook
    person.save()
}

但这需要他们每次想要更新时重新指定所有信息。所以我要做的就是让一切都变得可选:

class PersonUpdate {
    String phoneNumber
    Book favoriteBook

    static constraints = {
        phoneNumber nullable: true
        favoriteBook nullable: true
    }
}

def updatePerson(PersonUpdate cmd) {
    Person person = ...
    if (cmd.phoneNumber != null) person.phoneNumber = cmd.phoneNumber
    if (cmd.favoriteBook != null) person.favoriteBook = cmd.favoriteBook
    person.save()
}

现在,如果该人决定不再想要一本喜欢的书,会发生什么。他们会做的是发送一个JSON有效负载,如下所示:{favoriteBook:null}但是这不会做任何事情,因为在更新之前favoriteBook被检查为非空。

这通常归结为nullundefined之间的差异。

所以我的问题是:命令对象是否有任何方法可以使用可选的可空字段?如果是这样,我将如何做到满足上述情况呢?

2 个答案:

答案 0 :(得分:0)

您可以将域类实例的属性与命令对象的属性相关联,而不是手动检查

person.properties = cmd.properties

我与您共享控制器操作,以验证与您有关的案件

def update(UpdatePersonCommand command) {
    Person person = Person.get(params.id)

    if (command.hasErrors()) {
        respond ([errors: command.errors], model: [person: person], view: 'edit')

        return
    }

    person.properties = command.properties

    person.save(flush: true)

    redirect action: 'edit', id: params.id
}

您可以在 4.3实施编辑和更新操作部分中验证此grails guide中的更深层示例,您会发现类似的案例

答案 1 :(得分:0)

保持request.JSON可用,以便我们可以在其上运行containsKey()来测试请求是否传递了值。注意:将命令对象放在方法参数中将消耗request.JSON,它将为空。

class PersonUpdate implements grails.validation.Validateable {
    String phoneNumber
    Book favoriteBook

    static constraints = {
        phoneNumber nullable: true
        favoriteBook nullable: true
    }
}

def updatePerson() {
    PersonUpdate cmd = new PersonUpdate(request.JSON)
    Person person = ...
    if (request.JSON.containsKey("phoneNumber")) person.phoneNumber = cmd.phoneNumber
    if (request.JSON.containsKey("favoriteBook")) person.favoriteBook = cmd.favoriteBook
    person.save()
}