Grails 2.2.5升级至4.0.11后保存Decline域类出现异常验证错误
问题根本原因
该问题由Grails 3.x版本起的两项GORM默认规则变更共同导致:
1. 级联深度验证默认策略调整
Grails 2.2.x版本中,save()方法的deepValidate参数默认值为false,保存Decline对象时仅验证Decline自身属性,不会自动级联校验关联的User对象。
从Grails 3.0开始,save()方法的deepValidate默认值修改为true,保存主对象时会自动递归验证所有关联的域类属性,因此即使你没有主动修改或保存User对象,框架也会对赋值的user属性执行校验逻辑。
2. 枚举类型映射校验规则变更
Grails 3.3+重构了枚举类型的持久化校验逻辑,2.x版本默认隐式按照枚举的name()字符串做映射存储和校验,3.x之后该配置需要显式声明。如果你的User域类没有在mapping块中指定userType的枚举映射规则,GORM校验枚举字段时会出现类型转换异常,明明字段存在合法枚举值,却会被识别为null触发非空校验,和你遇到的报错特征完全吻合。
解决方案
可任选以下一种方式修复问题:
- 临时规避:保存
Decline时关闭深度验证,将保存代码修改为:decline.save(flush:true, deepValidate: false) - 永久修复:在
User域类的mapping代码块中显式指定userType的枚举映射方式,匹配2.x版本的默认逻辑:class User { UserType userType static mapping = { userType enumType: "string" } } - 关联规则调整:如果确认
Decline的user关联不需要任何级联操作,可以在Decline域类的约束配置中显式关闭级联验证:class Decline { User user static constraints = { user cascade: 'none' } }
内容的提问来源于stack exchange,提问作者John Moore
相关产品推荐
相关产品推荐

