grails异常:Tag [paginate]缺少必需属性[total]

时间:2013-08-30 16:13:31

标签: exception grails

我的控制器中有以下方法,用于列出患者实体:

def list(Integer max) {
    params.max = Math.min(max ?: 10, 100)


    def roles = springSecurityService.getPrincipal().getAuthorities()
    if(roles == 'ROLE_USER')
    {
        [patientInstanceList: Patient.findAllBySecUser(springSecurityService.getCurrentUser()), patientInstanceTotal: Patient.count()]
    }
    else if(roles == 'ROLE_ADMIN' || roles == 'ROLE_MANAGER')
    {
        [patientInstanceList: Patient.list(params), patientInstanceTotal: Patient.count()]
    }
}

如果我执行此方法,我有例外

Tag [paginate] is missing required attribute [total]

但是,如果我使用以下

def list(Integer max) {
    params.max = Math.min(max ?: 10, 100)
    [patientInstanceList: Patient.list(params), patientInstanceTotal: Patient.count()]
    }
}

一切都运作良好。我看到了患者创建的所有实例。我只希望根据用户登录的角色,我可以看到创建的所有实体的一部分。为什么会引发此异常?

我在这里发现了Grails pagination tag error类似的东西,但没有给出好的答案

1 个答案:

答案 0 :(得分:1)

我不确定你是否可以在if语句中省略return。另一个细节是您在ROLE_USER中过滤了您的域记录,但计算的总数与此过滤器无关。

您可以尝试这种方法:

def list(Integer max) {
    params.max = Math.min(max ?: 10, 100)

    def roles = springSecurityService.getPrincipal().getAuthorities()

    def model

    //I think roles is a list so your equals will not work...
    def admin = roles.find { it.authority == 'ROLE_ADMIN' || it.authority == 'ROLE_MANAGER' }
    if(admin) {
       model = [patientInstanceList: Patient.list(params), patientInstanceTotal: Patient.count()]
    } else {
      //createCriteria().list(params) will paginate...  
      def patientInstanceList = Patient.createCriteria().list(params) {
        eq('secUser', springSecurityService.currentUser)
      }
      //totalCount will trigger a query without the limit, but applying your filter
      model = [patientInstanceTotal: patientInstanceList.totalCount, patientInstanceList: patientInstanceList]
    }

    //and finally we return the model
    //return model
    //just to show that the return is optional

    model

}