Search code examples
grailsnullsavegrails-domain-classgrails-controller

Grails - Saving rejected null even though parameter initialized


Im fairly new to Grails and ive run into a (probably dumb) problem. When I try to save a domain instance it fails with ... on field 'deviceUsages[0].start': rejected value [null]...

This is the action on which it fails:

def save() {
            def user=params.remove('user.id')
            def deviceInstance=new Device(params)
            DeviceUsage du = new DeviceUsage(device: deviceInstance, user: User.get(user), start: new Date(), end: null)
            if(user){
                deviceInstance.addToDeviceUsages(du)
            }

            if (!deviceInstance.save(flush: true)) {
                deviceInstance.errors.each {
                    println it
                }

                render(view: "create", model: [deviceInstance: deviceInstance])
                return
            }

            du.save()
            flash.message = message(code: 'default.created.message', args: [message(code: 'device.label', default: 'Device'), deviceInstance.id])
            redirect(action: "show", id: deviceInstance.id)
        }

As you can see, 'start' is clearly initialized to a new Date... The domain classes in question are following:

class Device {

    String name
    String description
    Date created = new Date()
    Date deactivated
    User currentUser

    static hasMany = [
        deviceUsages: DeviceUsage
    ]

    static constraints = {
        name(nullable:false, blank:false)
        description(nullable:false, blank:true)
        created(nullable:false, display:false)
        deactivated(nullable:true)
        currentUser(nullable:true)
    }

and

class DeviceUsage implements Serializable{
    Date start
    Date end

    static belongsTo = [
        device: Device,
        user: User
    ]

    static constraints = {
        start(nullable:false)
        end(nullable:true)
    }

    static mapping = {
        id composite: ['device', 'user']
        version false
    }

Thanks for any help


Solution

  • Well I managed to solve it... Apparently new DeviceUsage(device: deviceInstance, user: User.get(user), start: new Date(), end: null) leaves start null for whatever reason, so adding du.start = new Date() at the next line fixed it...