我有一个grails应用程序,它在运行时以一种神秘的方式失败 (无论如何,对我来说是cyptic) 当我访问scaffolded / imca2 / imcaReferral / index时,使用 ArrayIndexOutOfBoundsException 。
*现已编辑,以便将解决方案放在最后*
有大约十几个域类。 我还没有担心UI,所以控制器都是动态搭建的。
所有其他控制器都正常工作。
此控制器:
package com.ubergen
class ImcaReferralController {
def scaffold = ImcaReferral
}
对于此域:
package com.ubergen
class ImcaReferral {
private def todayDate = new Date()
String advocacyReferenceNum = ""
[snip a lot of code]
String toString() {
"${this.advocacyReferenceNum}: ${this.client?this.client:'-'}${this.referralIssue?', '+this.referralIssue:''}"
}
}
(我不想把这里的域类发布为巨大的)。
生成此堆栈跟踪:
|Server running. Browse to http://localhost:8080/imca2
| Error 2014-03-12 18:48:24,935 [http-bio-8080-exec-3] ERROR errors.GrailsExceptionResolver - ArrayIndexOutOfBoundsException occurred when processing request: [GET] /imca2/imcaReferral/index
0. Stacktrace follows:
Message: 0
Line | Method
->> 55 | <init> in grails.orm.PagedResultList
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 15 | $tt__index in com.ubergen.ImcaReferralController
| 191 | doFilter . in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter
| 1146 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 615 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 701 | run . . . in java.lang.Thread
清洁和(重新)编译没有任何区别。
在引导期间正在使用域类将数据成功推送到数据库中,因此它可以正常工作。
我可以从命令行运行应用程序,而不是从eclipse / STS内部运行。抛出同样的错误。
run-app --noreloading也没有区别(现在抓着吸管)。并且run-war也会产生同样的错误。
run-app --verbose显示:
| Error 2014-03-12 19:58:37,745 [http-bio-8080-exec-1] ERROR errors.GrailsExceptionResolver - ArrayIndexOutOfBoundsException occurred when processing request: [GET] /imca2/imcaReferral/index
0. Stacktrace follows:
java.lang.ArrayIndexOutOfBoundsException: 0
at org.hibernate.criterion.Order.toSqlString(Order.java:73)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getOrderBy(CriteriaQueryTranslator.java:394)
[snip]
at grails.orm.PagedResultList.<init>(PagedResultList.java:55)
[snip]
at com.ubergen.ImcaReferral.list(ImcaReferral.groovy)
[snip]
at com.ubergen.ImcaReferralController.$tt__index(script1394654146228610896735.groovy:15)
[snip]
因此,索引页面调用域的list(),这在某种程度上是一个问题,但还不足以让它在stacktrace中被提及。
我应该先找哪个问题?
版本:
ubuntu 10.04
eclipse / SpringToolSuite 3.4.0
grails 2.3.6
groovy 2.1.9 (for both project and workspace)
更新13/03/2014
我按照Joe的建议(如下)发现问题确实存在于ImcaReferral.list()方法中。
在grails控制台中运行:
package com.ubergen
ImcaReferral.withTransaction { status ->
ImcaReferral.list()
}
返回
java.lang.ArrayIndexOutOfBoundsException: 0
at org.hibernate.criterion.Order.toSqlString(Order.java:73)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getOrderBy(CriteriaQueryTranslator.ja a:394)
[snip]
at com.ubergen.ImcaReferral.list(ImcaReferral.groovy)
查看域名的排序顺序信息 BINGO!其定义错误,有两种竞争定义如何对域进行排序。
我注释出错误的排序顺序信息:
package com.ubergen
class ImcaReferral {
...
static hasMany = [challenges:Challenge]
static mapping = {
...
sort dateReceived:'asc'
// sort challenges:'challengeRoute' // *** ERROR ***
}
}
和(重新启动控制台后)对列表的调用工作正常并返回一个空数组。
更正子记录的排序顺序:
package com.ubergen
class ImcaReferral {
...
static hasMany = [challenges:Challenge]
static mapping = {
...
sort dateReceived:'asc'
challenges sort: 'challengeRoute', order: 'asc' // *** CORRECT ***
}
}
解决了这个问题。脚手架现在有效。
结论
信任完整的堆栈跟踪,即使它相当冗长。它显示了要查看的类和方法。
学习使用控制台。
grails -reloading console
仔细阅读更多代码!
答案 0 :(得分:1)
你可以尝试生成静态脚手架,看看你是否得到了不同的结果。您也可以尝试在集成测试中运行列表,看看会发生什么。