Grails 2.3.6 Scaffolded index页面抛出ArrayIndexOutOfBoundsException

时间:2014-03-12 20:10:52

标签: grails grails-2.0 grails-2.3

我有一个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 ***
    }
}

解决了这个问题。脚手架现在有效。

结论

  1. 信任完整的堆栈跟踪,即使它相当冗长。它显示了要查看的类和方法。

  2. 学习使用控制台。

    grails -reloading console

  3. 仔细阅读更多代码!

1 个答案:

答案 0 :(得分:1)

你可以尝试生成静态脚手架,看看你是否得到了不同的结果。您也可以尝试在集成测试中运行列表,看看会发生什么。