3

This is my domain.

import org.apache.commons.lang.builder.EqualsBuilder
import org.apache.commons.lang.builder.HashCodeBuilder

class ManageVehicle implements Serializable {
    String vehicle
    Short truckKey=0
    Short siteID
    Integer unitID
    String wheelConfig
    String model
    Short period=0
    String usid=UUID.randomUUID().toString()
    //static belongsTo = [wheelConfig : TTType,model:TTModel]
    int hashCode() {
        def builder = new HashCodeBuilder()
        builder.append truckKey
        builder.append siteID
        builder.toHashCode()
    }

    boolean equals(other) {
        if (other == null) return false
        def builder = new EqualsBuilder()
        builder.append truckKey, other.truckKey
        builder.append siteID, other.siteID
        builder.isEquals()
    }

    static mapping = {
        table 'TF_Truck'
        version false
        truckKey column :'TruckKey'
        siteID column :'SiteID'
        id composite:['truckKey','siteID']
        vehicle column: 'TruckID' ,sqlType: 'nvarchar'
        wheelConfig column: 'TypID',sqlType: 'tinyint'
        model column: 'ModID' ,sqlType: 'tinyint'
        unitID column: 'McmID',sqlType: 'tinyint'
        period column: 'Period'
        usid generator: 'assigned', column:'USID', sqlType:'uniqueidentifier'
    }
    static constraints = {
        period nullable: false
        truckKey nullable: false
        siteID nullable: false
    }
}

And my save method in controller is .

def save(ManageVehicle manageVehicleInstance) {
    manageVehicleInstance.siteID=RequestContextHolder.currentRequestAttributes().getAttribute("SiteID",RequestAttributes.SCOPE_SESSION) as Short
    if (manageVehicleInstance == null) {
        notFound()
        return
    }

    if (manageVehicleInstance.hasErrors()) {
        respond manageVehicleInstance.errors, view:'create'
        return
    }

    manageVehicleInstance.save(flush:true,failOnError: true)

    request.withFormat {
        form {
            flash.message = message(code: 'default.created.message', args: [message(code: 'manageVehicle.label', default: 'Manage Vehicle'), manageVehicleInstance.id])
            redirect manageVehicleInstance
        }
        '*' { respond manageVehicleInstance, [status: CREATED] }
    }
}

while i am applying save operation on this domain i am getting following exception .

Message: Cannot redirect for object [ManageVehicle : (unsaved)] it is not a domain or has no identifier. Use an explicit redirect instead 

Suggest me some solution.

Michael
  • 32,527
  • 49
  • 210
  • 370
praveen_programmer
  • 1,072
  • 11
  • 25

1 Answers1

3

I guess that Grails cannot handle composite id in redirection. I have two options in my mind to fix that case

  1. Create id field for your domain class by removing id line from mappings
  2. Implement custom redirection for your saved object like redirect(action:'show', params:[truckKey:manageVehicleInstance.truckKey,siteID:manageVehicleInstance.siteID])

With 2. option you may also have to implement custom object loading into 'show' action using composite id like def manageVehicleInstance = ManageVehicle.findByTruckKeyAndSiteID(params.truckKey, params.siteID).

make
  • 41
  • 2