我从一位顾问那里继承了一个应用程序,并试图通过两个参数--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}")
}
}
}
}
答案 0 :(得分:2)
此方法是动态查找器。它的“实际代码”由GORM动态生成。 the documentation描述它的方式是:
GORM支持动态查找器的概念。动态查找器看起来 像静态方法调用一样,但方法本身没有 实际上在代码级别以任何形式存在。
相反,使用代码合成自动神奇地生成一个方法 运行时,基于给定类的属性。
因此,在这种情况下,GORM会创建一个带有where子句的select语句,该子句接受提供者ID和正在验证的标识符值。
如果要查看生成的查询,可以打开Hibernate SQL日志记录,或设置log4jdbc。