如果我有这样的域类:

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之前将其检查为非null。

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

所以我的问题是:命令对象是否有办法具有可选的可空字段?如果是这样,我将如何满足上述情况?

最佳答案

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

person.properties = cmd.properties

我与您共享 Controller 操作,以验证与您有关的类似案例
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中验证更深入的示例,实现编辑和更新操作,您会发现类似的情况

关于grails - Grails命令对象中的可选可空字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47047236/

10-12 15:51