Liferay 6.1 - Как программно назначить роль пользователю (в хуке)

Я использую liferay 6.1.1 CE GA2 в комплекте с tomcat 7.0.27 и hsql.

Я создал крючок для ExpandoValue, где я хочу назначить роль пользователю, когда я обновляю его настраиваемые поля. Вот что я пробовал:

public class UserTagValueListener implements ModelListener<ExpandoValue>{
    @Override
    public void onAfterUpdate(ExpandoValue arg0) throws ModelListenerException {       
        long userId = arg0.getClassPK();
        long roleId = (long)1; //could be any role

        try {
            System.out.println("user roles : " + UserUtil.getRoles(userId));

            /* I tried these 4 lines with the same result */
            //UserLocalServiceUtil.addRoleUsers(roleId, new long[]{userId});
            //RoleLocalServiceUtil.addUserRoles(userId, new long[]{roleId});
            //UserUtil.addRole(userId, roleId);
            RoleUtil.addUser(roleId, userId);
        } catch (PortalException e) {
            e.printStackTrace();
        } catch (SystemException e) {
            e.printStackTrace();
        }
        System.out.println("user roles : " + UserUtil.getRoles(userId));
    }
}

Когда я проверяю роли до и после строки, где я добавляю UserRole, это показывает, что роль была добавлена ​​​​моему текущему пользователю. Но как только выполнение завершено, у пользователя больше нет роли.

Что я делаю не так?


person user2765347    schedule 10.09.2013    source источник
comment
У меня RoleLocalServiceUtil.addUserRoles(userId, roleIds); работает без проблем. Есть ли какой-то другой хук, который может обновлять роли?   -  person Prakash K    schedule 11.09.2013
comment
Нет другого хука, обновляющего роли. Похоже, что изменение не зафиксировано в БД?   -  person user2765347    schedule 11.09.2013
comment
Надеюсь, что идентификатор роли и идентификатор пользователя, которые вы предоставляете, являются правильными, то есть они существуют в базе данных. Попробуйте добавить что-нибудь в другую таблицу в том же коде. Также есть ли какие-либо исключения?   -  person Prakash K    schedule 11.09.2013
comment
Нет никаких исключений. Я попытался создать роль с помощью метода RoleLocalServiceUtil.addRole(...), и это сработало, созданная роль находится в БД.   -  person user2765347    schedule 11.09.2013
comment
Итак, после этого вы пробовали это RoleLocalServiceUtil.addUserRoles(userId, roleIds); с соответствующими идентификаторами ролей и пользователей?   -  person Prakash K    schedule 11.09.2013
comment
Я использовал RoleUtil.addUser(roleId, userId);, но это не сработало, user_roles нет в БД.   -  person user2765347    schedule 11.09.2013
comment
Я бы не рекомендовал использовать RoleUtil т.е. классы пакета persistence извне реализации *LocalService. вместо этого попробуйте использовать RoleLocalServiceUtil.addUserRoles(userId, roleIds);, это должно сработать. Хотя я не тестировал с RoleUtil.   -  person Prakash K    schedule 12.09.2013
comment
Я только что попробовал, но это дало мне тот же результат. Буду смотреть БД.   -  person user2765347    schedule 12.09.2013


Ответы (2)


Это сработало для меня. Тип — это значение, которое я получаю из роли поля выбора на странице создания account.jsp.

 String[] usery = (String[])user.getExpandoBridge().getAttribute("Type"); 

 Role role = RoleLocalServiceUtil.getRole(company.getCompanyId(), usery[0]);

 UserLocalServiceUtil.addRoleUser(role.getRoleId(), user.getUserId());

 UserLocalServiceUtil.updateUser(user);
person Aravinth    schedule 17.04.2014

это сработало для меня:

try {

    User newUser = .....
    long roleId = ....      

    Role role = RoleLocalServiceUtil.getRole(roleId);

    System.out.println("Found role : " + role.getRoleId());
    RoleUtil.addUser(role.getRoleId(), newUser.getUserId());
    UserLocalServiceUtil.updateUser(newUser);
    RoleLocalServiceUtil.updateRole(role);

} catch (Exception e) {
    e.printStackTrace();
}
person yannicuLar    schedule 11.09.2013
comment
Я попытался обновить роль и пользователя, как вы, но это не сработало. Таблица БД, которую я хочу изменить, — это users_role, я ничего не изменяю в роли или пользователе. - person user2765347; 11.09.2013
comment
то по какой-то причине ваша база данных не обновляется. возможно, вам следует сосредоточиться на этом вопросе, а остальная часть кода, связанного с назначением ролей, не имеет значения. - person yannicuLar; 11.09.2013