我今天在我们的 grails 应用程序中发现了一个非常奇怪的行为,我想与您分享。
我们在 mysql 5.1.48 上使用 grails 2.3.11。
我们 DomainObject.findById( id )
在您的控制器操作之一中进行了操作。我们未能检查 id 是否为空值,因此DomainObject.findById( null )
当没有 id 作为参数传递时会调用它。
通常DomainObject.findById( null )
会返回 null 但有一个特殊条件会产生其他结果!
如果之前调用的控制器操作在数据库中插入了一条新记录(我们称之为对象 B),则无论存储的域对象如何,DomainObject.findById( null )
都会找到与对象 B 插入时具有相同 ID 的DomainObject 。
因此,当在保存任何内容之前调用的控制器操作findById(null)
将返回一行。并且该行将具有与最后插入的元素相同的 id。
我完全知道使用findById(null)
不是理想的方法,但我对它产生的结果感到非常震惊。但是返回任何看似“随机”的结果对我来说似乎很奇怪。
我还想指出,DomainObject.get(null)
不会遭受这个问题。
其他人见证了这一点吗?
有一个活跃的 Jira 指向这个方向:https ://jira.grails.org/browse/GRAILS-9628但它并没有真正描述这个问题。