Java Liferay 6.1-如何通过编程方式将角色分配给用户(在挂钩中)

Java Liferay 6.1-如何通过编程方式将角色分配给用户(在挂钩中),java,liferay,hook,liferay-6,user-roles,Java,Liferay,Hook,Liferay 6,User Roles,我使用的是与tomcat 7.0.27和hsql捆绑在一起的liferay 6.1.1 CE GA2 我在ExpandoValue上创建了一个钩子,当我更新用户的自定义字段时,我想在其中为用户分配一个角色。以下是我尝试过的: public class UserTagValueListener implements ModelListener<ExpandoValue>{ @Override public void onAfterUpdate(ExpandoValue

我使用的是与tomcat 7.0.27和hsql捆绑在一起的liferay 6.1.1 CE GA2

我在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));
    }
}
公共类UserTagValueListener实现ModelListener{
@凌驾
更新后(ExpandoValue arg0)上的公共void引发ModelListenerException{
long userId=arg0.getClassPK();
long roleId=(long)1;//可以是任何角色
试一试{
System.out.println(“用户角色:+UserUtil.getRoles(userId));
/*我试了这4行,结果都一样*/
//UserLocalServiceUtil.addRoleUsers(roleId,新的long[]{userId});
//RoleLocalServiceUtil.addUserRoles(userId,新长[]{roleId});
//UserUtil.addRole(userId,roleId);
RoleUtil.addUser(roleId,userId);
}捕获(PortalException e){
e、 printStackTrace();
}捕获(系统异常e){
e、 printStackTrace();
}
System.out.println(“用户角色:+UserUtil.getRoles(userId));
}
}
当我在添加UserRole的行之前和之后检查角色时,它显示该角色已添加到我的当前用户。但一旦执行完成,用户就不再具有该角色

我做错了什么

这对我很有用:

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();
}
这对我有用。 Type是我从createaccount.jsp页面中的selectbox角色获得的值

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

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

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

 UserLocalServiceUtil.updateUser(user);

对于我
RoleLocalServiceUtil.addUserRoles(userId,roleIds)工作没有任何问题。是否还有其他钩子可能正在更新角色?不,没有其他钩子更新角色。看起来更改没有提交给数据库?希望您提供的roleId和userId是正确的,即它们存在于数据库中。尝试在同一代码中的其他表中添加一些内容。也有例外吗?没有例外。我试图用RoleLocalServiceUtil.addRole(…)方法创建一个角色,它成功了,我创建的角色在数据库中。所以在那之后,你尝试了这个
RoleLocalServiceUtil.addUserRoles(userId,roleIds)使用适当的角色ID和用户ID?我尝试像您一样更新角色和用户,但没有成功。我想在这里更改的数据库表是users\u role,我不会修改该角色或用户的任何内容。然后由于某些原因,您的数据库不会更新。也许你应该把注意力集中在这件事上,与角色分配相关的代码的其余部分是不相关的