grails - 继承的域类属性的验证

时间:2016-11-09 23:05:55

标签: validation grails gorm

我有一个相当直接的用户模型,其中包含特殊用户的个人资料和专家:

class User { static hasOne = [profile: Profile] }

class Profile {
    String country
    static constraints = { country nullable: true, blank: true }
}

class Expert extends User {
    static constraints = {
        profile validator: { val, obj ->
            if (!val.country) {
                val.errors.rejectValue 'country', 'expert.profile.country.nullable'
            }
        }
    }
}

当我创建专家时,设置他们的配置文件属性然后保存专家,这可以正常工作。但是,如果用户想要保存他们的个人资料,我会坚持如何根据他们是否是专家来正确验证个人资料属性。

这是我到目前为止所做的:

    Expert expert = Expert.get(profile.user.id)
    if (expert) {
        expert.properties = params
        expert.save()
    } else {
        profile.user.properties = params
        profile.user.save()
    }

此代码执行正确的验证并设置正确的错误消息。但是,(至少)有三个问题:

  1. 执行配置文件更新的服务不应该真正了解不同类型的用户。
  2. 在配置文件中设置错误时,仍会保存配置文件 到DB。
  3. 错误代码在第二次尝试之前不会变成消息 用于更新个人资料。
  4. 验证继承的域类属性的正确方法是什么?或者,是否有更好的模型可用于实现具有特定于角色的验证要求的不同类型用户的目标?

    编辑:事实证明,只有三个问题中的第一个是真实的。另外两个是由标签lib在尝试查询数据库时保存用户对象引起的。接受的解决方案(基于用户标志在Profile中进行验证)解决了这个问题。

1 个答案:

答案 0 :(得分:2)

我认为您必须设置配置文件属于用户,并且可以为空。之后,您可以在配置文件类中创建验证器。也许对你而言,专家类型需要一个新的课程,但我不确定这是否是强制性的。

也许我可以在User类中实现一个方法,以根据其属性或属性本身来了解实体是否是专家

class User { 
    static hasOne = [profile: Profile] 
    boolean expert
}

class Profile {
    static belongsTo = [user: User]
    String country
    static constraints = { 
        country validator: { val, obj ->
            if (obj.user?.expert && !val.country) {
                val.errors.rejectValue 'country', 'expert.profile.country.nullable'
            }
        } 
        user nullable: true
    }
}