Return 来自 Grails Tablib 的布尔值?

Return Boolean value from Grails Tablib?

我创建了一个自定义的 Grails tablib:

  def hasRole = { attrs, body ->
    boolean result = false 
    if (attrs.roles) {
      if (SpringSecurityUtils.ifAnyGranted(attrs.roles)) {
        result = true
      }
    }
    out << result  
  }

可以这样使用:

${cust.hasRole(roles:'ROLE_ADMIN') ? 'yes' : 'no' }

问题是比较结果总是yes。它认为表达式没有被正确评估。

返回的 class 类型的 hasRole 是 org.codehaus.groovy.grails.web.util.StreamCharBuffer

如何正确计算上述表达式,使 hasRole() returns 成为布尔值?

关键在于在您的 TagLib 中使用 returnObjectForTags。默认情况下,标记库将信息输出到输出编写器 (out)。在你的情况下你想做这样的事情:

package example

class FooTagLib {
  static namespace = 'something'
  static returnObjectForTags = ['hasRole']

  def hasRole = { attrs, body ->
    boolean result = false
    ...
    return result
  }
}

如您所见,returnObjectForTags 是 methods/closures 的静态列表,您希望将其作为 return 实际对象,并且不希望直接修改输出流。