2012-05-18 44 views
0

我在stackoverflow中搜索grailsApplication.controllerClasses過濾器,我按照正確的答案。gsp中的grailsApplication.controllerClasses過濾器

我寫這樣的代碼。

<g:each var="c" in="${grailsApplication.controllerClasses.each{GrailsClassUtils.isClassBelowPackage(it.clazz, ['com.posplus.product']) }.sort{ it.fullName } }"> 
     <li> 
     <g:link controller="${c.logicalPropertyName}" action="list" data-pjax='#main'> 
        <g:message code="${c.logicalPropertyName}.label" default="${c.logicalPropertyName}"/> 
     </g:link> 
     </li> 
</g:each> 

它會導致錯誤堆棧

org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException: Error applying layout : bootstrap 
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    java.lang.Thread.run(Thread.java:680) 
root cause 

org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException: Error processing GroovyPageView: Error executing tag <g:include>: Unable to execute include: Request processing failed; nested exception is org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException: Error evaluating expression [grailsApplication.controllerClasses.each{GrailsClassUtils.isClassBelowPackage(it.clazz, ['com.posplus.product']) }.sort{ it.fullName }] on line [13]: null 
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    java.lang.Thread.run(Thread.java:680) 
root cause 

org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException: Error executing tag <g:include>: Unable to execute include: Request processing failed; nested exception is org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException: Error evaluating expression [grailsApplication.controllerClasses.each{GrailsClassUtils.isClassBelowPackage(it.clazz, ['com.posplus.product']) }.sort{ it.fullName }] on line [13]: null 
    Users_wenhaoliu_Documents_workspace_posplus_grails_app_views_layouts_bootstrap_gsp$_run_closure2.doCall(bootstrap.gsp:13) 
    Users_wenhaoliu_Documents_workspace_posplus_grails_app_views_layouts_bootstrap_gsp.run(bootstrap.gsp:21) 
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    java.lang.Thread.run(Thread.java:680) 
root cause 

org.codehaus.groovy.grails.web.servlet.mvc.exceptions.ControllerExecutionException: Unable to execute include: Request processing failed; nested exception is org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException: Error evaluating expression [grailsApplication.controllerClasses.each{GrailsClassUtils.isClassBelowPackage(it.clazz, ['com.posplus.product']) }.sort{ it.fullName }] on line [13]: null 
    Users_wenhaoliu_Documents_workspace_posplus_grails_app_views_layouts_bootstrap_gsp$_run_closure2.doCall(bootstrap.gsp:13) 
    Users_wenhaoliu_Documents_workspace_posplus_grails_app_views_layouts_bootstrap_gsp.run(bootstrap.gsp:21) 
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    java.lang.Thread.run(Thread.java:680) 
root cause 

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException: Error evaluating expression [grailsApplication.controllerClasses.each{GrailsClassUtils.isClassBelowPackage(it.clazz, ['com.posplus.product']) }.sort{ it.fullName }] on line [13]: null 
    Users_wenhaoliu_Documents_workspace_posplus_grails_app_views_layouts_bootstrap_gsp$_run_closure2.doCall(bootstrap.gsp:13) 
    Users_wenhaoliu_Documents_workspace_posplus_grails_app_views_layouts_bootstrap_gsp.run(bootstrap.gsp:21) 
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    java.lang.Thread.run(Thread.java:680) 
root cause 

org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException: Error evaluating expression [grailsApplication.controllerClasses.each{GrailsClassUtils.isClassBelowPackage(it.clazz, ['com.posplus.product']) }.sort{ it.fullName }] on line [13]: null 
    Users_wenhaoliu_Documents_workspace_posplus_grails_app_views_includes_subnav_gsp.run(subnav.gsp:13) 
    Users_wenhaoliu_Documents_workspace_posplus_grails_app_views_layouts_bootstrap_gsp$_run_closure2.doCall(bootstrap.gsp:13) 
    Users_wenhaoliu_Documents_workspace_posplus_grails_app_views_layouts_bootstrap_gsp.run(bootstrap.gsp:21) 
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    java.lang.Thread.run(Thread.java:680) 
root cause 

java.lang.NullPointerException 
    Users_wenhaoliu_Documents_workspace_posplus_grails_app_views_includes_subnav_gsp$_run_closure3_closure8.doCall(subnav.gsp:13) 
    Users_wenhaoliu_Documents_workspace_posplus_grails_app_views_includes_subnav_gsp$_run_closure3.doCall(subnav.gsp:13) 
    Users_wenhaoliu_Documents_workspace_posplus_grails_app_views_includes_subnav_gsp.run(subnav.gsp:13) 
    Users_wenhaoliu_Documents_workspace_posplus_grails_app_views_layouts_bootstrap_gsp$_run_closure2.doCall(bootstrap.gsp:13) 
    Users_wenhaoliu_Documents_workspace_posplus_grails_app_views_layouts_bootstrap_gsp.run(bootstrap.gsp:21) 
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    java.lang.Thread.run(Thread.java:680) 

,但如果我改變代碼

<g:each var="c" in="${grailsApplication.controllerClasses.each{GrailsClassUtils.isClassBelowPackage(it.class, ['com.posplus.product']) }.sort{ it.fullName } }"> 
     <li> 
      <g:link controller="${c.logicalPropertyName}" action="list" data-pjax='#main'> 
        <g:message code="${c.logicalPropertyName}.label" default="${c.logicalPropertyName}"/> 
      </g:link> 
     </li> 
</g:each> 

它列出所有的控制器。這裏有什麼錯?

+0

檢查這個答案http://stackoverflow.com/a/9476222/206351 – Saurabh

+0

hi.i已經閱讀了答案之前ask.have你嘗試我的代碼或眼睛it.when我使用「it.clazz」,導致nullpointexception 。 – sjbwylbs

+0

我得到了原因。我有一個類沒有包,所以它會導致null點異常。問題是正確的!謝謝。 – sjbwylbs

回答

0

我處理那個,因爲GrailsClassUtils.isClassBelowPackage不能處理非包類。我寫了一個函數來解決這個問題。

public static boolean isClassBelowPackage(Class<?> theClass, List<?> packageList) { 
    if(theClass.package==null)return false 
    String classPackage = theClass.package.name; 
    for (Object packageName : packageList) { 
     if (packageName != null) { 
      if (classPackage.startsWith(packageName.toString())) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 
在GSP

是:

<g:each var="c" in="${grailsApplication.controllerClasses.findAll{MyGrailsClassUtils.isClassBelowPackage(it.clazz, ['com.posplus.product']) }.sort{ it.fullName } }"> 
     <li> 
     <g:link controller="${c.logicalPropertyName}" action="list" data-pjax='#main'> 
        <g:message code="${c.logicalPropertyName}.label" default="${c.logicalPropertyName}"/> 
     </g:link> 
     </li> 
</g:each> 
0

雖然我相信你的答案是工作就好了,我不明白,爲什麼你不使用原始GrailsClassUtils。所有你需要做的就是導入它們。

這就是我所做的,它的工作原理非常完美。

這不是我打算回覆使用的答案,但由於缺乏聲譽,我不得不。

+0

在版本(5年前版本)沒有處理。也可以說有一個bug!它固定在你的版本上,我想是的。 – sjbwylbs