Getting validation error in grails version 3.3.11 but not in grails 2.0.1

Viewed 241

Getting validation error in grails version 3.3.11 but not in grails 2.0.1

Please find sample code below

//**Domain classes**

class Booking {
    String bookingtype;
    Patient patient
    static constraints = {
    }
}

class ContactDetails {
    String city
    String state
    String postCode

    static constraints = {
        city blank: false
        postCode blank: false
        state blank: false
    }
}

class Patient {
    String name;
    ContactDetails contactDetails

    static embedded = ['contactDetails']

    static constraints = {
        contactDetails nullable: true
    }
}


//**Controller**
class NewHomeController {

    def index() { }

    def createContactDetails(){
        def patient=new Patient()
        patient.name="Name"
        patient.contactDetails=new ContactDetails()
        patient.save(flush: true,deepValidate:false)
        def booking=new Booking()
        booking.bookingtype="Online"
        booking.patient=patient;
        booking.save(flush: true,failOnError: true)
        render "Done"
    }
}

If I run above code in grails 2.0.1 it is running fine but not in grails 3.3.11. If I persist object as booking.save(flush: true,deepValidate:false) then it is working fine since it will ignore validating child associations.

There is no difference in auto table creation in from grails 2 to grails 3

**Grails 3**
--------
CREATE TABLE `patient` (
   id` bigint(20) NOT NULL AUTO_INCREMENT,
   `version` bigint(20) NOT NULL,
   `name` varchar(255) NOT NULL,
   `contact_details_city` varchar(255) DEFAULT NULL,
   `contact_details_country` varchar(11) DEFAULT NULL,
   `contact_details_state` varchar(255) DEFAULT NULL,
   `contact_details_post_code` varchar(255) DEFAULT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
 
 
 CREATE TABLE `contact_details` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT,
   `version` bigint(20) NOT NULL,
   `city` varchar(255) NOT NULL,
   `country` varchar(11) NOT NULL,
   `state` varchar(255) NOT NULL,
   `post_code` varchar(255) NOT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
 
 
 CREATE TABLE `booking` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT,
   `version` bigint(20) NOT NULL,
   `patient_id` bigint(20) NOT NULL,
   `bookingtype` varchar(255) NOT NULL,
   PRIMARY KEY (`id`),
   KEY `FK1o2fk91av3dkwlxpexo94lcbg` (`patient_id`),
   CONSTRAINT `FK1o2fk91av3dkwlxpexo94lcbg` FOREIGN KEY (`patient_id`) REFERENCES `patient` (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
 
 
 
 **Grails 2**
 ---------
 
 
CREATE TABLE `patient` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT,
   `version` bigint(20) NOT NULL,
   `contact_details_city` varchar(255) DEFAULT NULL,
   `contact_details_country` varchar(11) DEFAULT NULL,
   `contact_details_post_code` varchar(255) DEFAULT NULL,
   `contact_details_state` varchar(255) DEFAULT NULL,
   `name` varchar(255) NOT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
 
 CREATE TABLE `contact_details` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT,
   `version` bigint(20) NOT NULL,
   `city` varchar(255) NOT NULL,
   `country` varchar(11) NOT NULL,
   `post_code` varchar(255) NOT NULL,
   `state` varchar(255) NOT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
 
 
 CREATE TABLE `booking` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT,
   `version` bigint(20) NOT NULL,
   `bookingtype` va rchar(255) NOT NULL,
   `patient_id` bigint(20) NOT NULL,
   PRIMARY KEY (`id`),
   KEY `FK3DB0859F465DE24` (`patient_id`),
   CONSTRAINT `FK3DB0859F465DE24` FOREIGN KEY (`patient_id`) REFERENCES `patient` (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

The validation exception which I'm getting is

Caused by: grails.validation.ValidationException: Validation Error(s) occurred during save():
- Field error in object 'domain_constraint_verification_3_3_11.Booking' on field 'patient.contactDetails.city': rejected value [null]; codes [domain_constraint_verification_3_3_11.ContactDetails.city.nullable.error.domain_constraint_verification_3_3_11.Booking.patient.contactDetails.city,domain_constraint_verification_3_3_11.ContactDetails.city.nullable.error.patient.contactDetails.city,domain_constraint_verification_3_3_11.ContactDetails.city.nullable.error.city,domain_constraint_verification_3_3_11.ContactDetails.city.nullable.error.java.lang.String,domain_constraint_verification_3_3_11.ContactDetails.city.nullable.error,contactDetails.city.nullable.error.domain_constraint_verification_3_3_11.Booking.patient.contactDetails.city,contactDetails.city.nullable.error.patient.contactDetails.city,contactDetails.city.nullable.error.city,contactDetails.city.nullable.error.java.lang.String,contactDetails.city.nullable.error,domain_constraint_verification_3_3_11.ContactDetails.city.nullable.domain_constraint_verification_3_3_11.Booking.patient.contactDetails.city,domain_constraint_verification_3_3_11.ContactDetails.city.nullable.patient.contactDetails.city,domain_constraint_verification_3_3_11.ContactDetails.city.nullable.city,domain_constraint_verification_3_3_11.ContactDetails.city.nullable.java.lang.String,domain_constraint_verification_3_3_11.ContactDetails.city.nullable,contactDetails.city.nullable.domain_constraint_verification_3_3_11.Booking.patient.contactDetails.city,contactDetails.city.nullable.patient.contactDetails.city,contactDetails.city.nullable.city,contactDetails.city.nullable.java.lang.String,contactDetails.city.nullable,nullable.domain_constraint_verification_3_3_11.Booking.patient.contactDetails.city,nullable.patient.contactDetails.city,nullable.city,nullable.java.lang.String,nullable]; arguments [city,class domain_constraint_verification_3_3_11.ContactDetails]; default message [Property [{0}] of class [{1}] cannot be null]
- Field error in object 'domain_constraint_verification_3_3_11.Booking' on field 'patient.contactDetails.state': rejected value [null]; codes [domain_constraint_verification_3_3_11.ContactDetails.state.nullable.error.domain_constraint_verification_3_3_11.Booking.patient.contactDetails.state,domain_constraint_verification_3_3_11.ContactDetails.state.nullable.error.patient.contactDetails.state,domain_constraint_verification_3_3_11.ContactDetails.state.nullable.error.state,domain_constraint_verification_3_3_11.ContactDetails.state.nullable.error.java.lang.String,domain_constraint_verification_3_3_11.ContactDetails.state.nullable.error,contactDetails.state.nullable.error.domain_constraint_verification_3_3_11.Booking.patient.contactDetails.state,contactDetails.state.nullable.error.patient.contactDetails.state,contactDetails.state.nullable.error.state,contactDetails.state.nullable.error.java.lang.String,contactDetails.state.nullable.error,domain_constraint_verification_3_3_11.ContactDetails.state.nullable.domain_constraint_verification_3_3_11.Booking.patient.contactDetails.state,domain_constraint_verification_3_3_11.ContactDetails.state.nullable.patient.contactDetails.state,domain_constraint_verification_3_3_11.ContactDetails.state.nullable.state,domain_constraint_verification_3_3_11.ContactDetails.state.nullable.java.lang.String,domain_constraint_verification_3_3_11.ContactDetails.state.nullable,contactDetails.state.nullable.domain_constraint_verification_3_3_11.Booking.patient.contactDetails.state,contactDetails.state.nullable.patient.contactDetails.state,contactDetails.state.nullable.state,contactDetails.state.nullable.java.lang.String,contactDetails.state.nullable,nullable.domain_constraint_verification_3_3_11.Booking.patient.contactDetails.state,nullable.patient.contactDetails.state,nullable.state,nullable.java.lang.String,nullable]; arguments [state,class domain_constraint_verification_3_3_11.ContactDetails]; default message [Property [{0}] of class [{1}] cannot be null]
- Field error in object 'domain_constraint_verification_3_3_11.Booking' on field 'patient.contactDetails.postCode': rejected value [null]; codes [domain_constraint_verification_3_3_11.ContactDetails.postCode.nullable.error.domain_constraint_verification_3_3_11.Booking.patient.contactDetails.postCode,domain_constraint_verification_3_3_11.ContactDetails.postCode.nullable.error.patient.contactDetails.postCode,domain_constraint_verification_3_3_11.ContactDetails.postCode.nullable.error.postCode,domain_constraint_verification_3_3_11.ContactDetails.postCode.nullable.error.java.lang.String,domain_constraint_verification_3_3_11.ContactDetails.postCode.nullable.error,contactDetails.postCode.nullable.error.domain_constraint_verification_3_3_11.Booking.patient.contactDetails.postCode,contactDetails.postCode.nullable.error.patient.contactDetails.postCode,contactDetails.postCode.nullable.error.postCode,contactDetails.postCode.nullable.error.java.lang.String,contactDetails.postCode.nullable.error,domain_constraint_verification_3_3_11.ContactDetails.postCode.nullable.domain_constraint_verification_3_3_11.Booking.patient.contactDetails.postCode,domain_constraint_verification_3_3_11.ContactDetails.postCode.nullable.patient.contactDetails.postCode,domain_constraint_verification_3_3_11.ContactDetails.postCode.nullable.postCode,domain_constraint_verification_3_3_11.ContactDetails.postCode.nullable.java.lang.String,domain_constraint_verification_3_3_11.ContactDetails.postCode.nullable,contactDetails.postCode.nullable.domain_constraint_verification_3_3_11.Booking.patient.contactDetails.postCode,contactDetails.postCode.nullable.patient.contactDetails.postCode,contactDetails.postCode.nullable.postCode,contactDetails.postCode.nullable.java.lang.String,contactDetails.postCode.nullable,nullable.domain_constraint_verification_3_3_11.Booking.patient.contactDetails.postCode,nullable.patient.contactDetails.postCode,nullable.postCode,nullable.java.lang.String,nullable]; arguments [postCode,class domain_constraint_verification_3_3_11.ContactDetails]; default message [Property [{0}] of class [{1}] cannot be null]

Didn't find any updates related to validation in latest grails docs. Am I missing anything ?

1 Answers

I fixed this by disabling deep-validate since in newer versions of grails there are some updates to deep-validation.

Related