我正在使用Spring Security Plugin。默认情况下,此插件在我的项目中创建了三个类。
org.me.example.UserRole.UserRole
org.me.example.UserRole.User
org.me.example.UserRole.Role
User
和Role
类彼此不了解,但UserRole
类同时包含User
和Role
对象。 Role
对象只有一个属性,一个名为authority
的字符串。
我的目标是在Users
声明中获取具有特定authority
的所有<g:select>
。
以下是我的一次尝试:
<g:select name="loggedBy.id" from="${org.me.example.UserRole.UserRole.list(fetch:[(role.authority):"ROLE_ADMIN"])}" optionKey="id" value="" />
我确实知道这会返回UserRole
列表,而不是User
列表。反正有没有“加入”我的课程,所以我可以检索我想要的数据?寻找最干净的解决方案。
更新
我认为我的课程看起来有点混乱,所以这里是精简版本。
class UserRole {
User user
Role role
//more stuff
}
class Role {
String authority
//more stuff
}
class User {
//lots of stuff, but nothing that links back to the Role class or the UserRole class
}
UserRole
不遵循Java包命名约定。这是真的,但是如果我没记错的话,Spring Security Core插件会自动创建该包及其中的类,所以我没有弄乱这个名字......但是我已经有一段时间了,所以我可以被误认为是自动命名包裹。
<g:set var="desiredRole" value='${org.me.example.UserRole.Role.findByAuthority("ROLE_ADMIN")}' />
<g:select name="loggedBy.id" from="${org.me.example.UserRole.UserRole.findAllByRole(desiredRole).user}" optionKey="id" value="" />
答案 0 :(得分:2)
最好在控制器中执行此操作:
def usersWithAdminRole = UserRole.withCriteria {
eq("role", Role.findByAuthority('ROLE_ADMIN'))
}.collect {
it.user
}
<g:select from="${usersWithAdminRole}" name="loggedBy.id" optionKey="id" />
答案 1 :(得分:2)
UserRole
是UserRole
的嵌套类。)基本上你的代码片段很好(从概念上讲)。请注意,您不能在双引号属性值中使用双引号!我认为这已经阻止了你的进步。您可以尝试以下方法:
<g:set var="desiredRole"
value='${org.me.example.UserRole.findByAuthority("ROLE_ADMIN")}' />
<g:select name="userSelect"
from="${org.me.example.UserRole.findAllByRole(desiredRole).user}" />
请注意,从UserRole-instances访问用户实例是一个常规糖。有关示例,请参阅http://groovy.codehaus.org/Collections。