域类中的验证方法

时间:2013-06-28 14:54:30

标签: grails

我从一位顾问那里继承了一个应用程序,并试图通过两个参数--Providier和Identifier来跟踪从数据库中找到用户的代码。

从我收集的内容中,有一个控制器方法,该方法又调用一个服务方法,该服务方法调用名为登录的域类中的验证器。

我觉得我在这里走到了尽头。我希望在哪里找到 Login.findByProviderAndIdentifier()的实际代码?

class Login {
  String id
  String identifier
  String password
  boolean generated = false
  Provider provider
    Date lastUpdated
    Date dateCreated
    Boolean isActive = true

    static constraints = {
        identifier(blank:false,
                   validator: {val, obj, errs ->
                       if (val && obj.provider && !obj.generated) {
                           def dbLogin = Login.findByProviderAndIdentifier(obj.provider, val)
                           if (dbLogin && dbLogin.id != obj.id) {
                               errs.rejectValue("identifier", "unique", [obj.provider.name, obj.identifier] as Object[], "Identifier ${obj.identifier} already exists for provider ${obj.provider.name}")
                           }
                       }
                   }
               }

1 个答案:

答案 0 :(得分:2)

此方法是动态查找器。它的“实际代码”由GORM动态生成。 the documentation描述它的方式是:

  

GORM支持动态查找器的概念。动态查找器看起来   像静态方法调用一样,但方法本身没有   实际上在代码级别以任何形式存在。

     

相反,使用代码合成自动神奇地生成一个方法   运行时,基于给定类的属性。

因此,在这种情况下,GORM会创建一个带有where子句的select语句,该子句接受提供者ID和正在验证的标识符值。

如果要查看生成的查询,可以打开Hibernate SQL日志记录,或设置log4jdbc