我创建了一个自定义Grails tablib:
def hasRole = { attrs, body ->
boolean result = false
if (attrs.roles) {
if (SpringSecurityUtils.ifAnyGranted(attrs.roles)) {
result = true
}
}
out << result
}
Run Code Online (Sandbox Code Playgroud)
这可以这样使用:
${cust.hasRole(roles:'ROLE_ADMIN') ? 'yes' : 'no' }
Run Code Online (Sandbox Code Playgroud)
问题是总是比较结果yes.它接缝表达式未正确评估.
hasRole的返回类类型是org.codehaus.groovy.grails.web.util.StreamCharBuffer.
如何正确评估上面的表达式,以便hasRole()返回一个布尔值?
关键是returnObjectForTags在TagLib中使用.默认情况下,标记库将信息输出到输出writer(out).在你的情况下,你想做这样的事情:
package example
class FooTagLib {
static namespace = 'something'
static returnObjectForTags = ['hasRole']
def hasRole = { attrs, body ->
boolean result = false
...
return result
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样returnObjectForTags,您希望返回实际对象的方法/闭包的静态列表,并且不希望直接修改输出流.