Grailsбеды - PullRequest
       5

Grailsбеды

0 голосов
/ 15 августа 2011

Я использую 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

}

Ответ Крудофа сработал для меня после некоторых изменений.Crudof указал, что имя пакета 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=""  />

Ответы [ 2 ]

2 голосов
/ 15 августа 2011
  1. Имена ваших пакетов не соответствуют общепринятым java-стандартам: имена пакетов должны начинаться с буквы / HAVE TO. В противном случае можно запутаться, что это может быть класс (где UserRole - это вложенный класс UserRole).
  2. В основном ваш фрагмент кода в порядке (концептуально). Обратите внимание, что нельзя использовать двойные кавычки в значениях атрибутов двойных кавычек! Я думаю, что это остановило ваш прогресс. Вы можете попробовать следующее:

    <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 - это очень хороший сахар. См. http://groovy.codehaus.org/Collections для нескольких примеров.

2 голосов
/ 15 августа 2011

Было бы лучше сделать это в контроллере:

def usersWithAdminRole = UserRole.withCriteria {
  eq("role", Role.findByAuthority('ROLE_ADMIN'))
}.collect {
  it.user
}

<g:select from="${usersWithAdminRole}" name="loggedBy.id" optionKey="id" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...