修复" PrincipalException:PermissionChecker未初始化" Liferay 7路

时间:2017-11-09 04:34:22

标签: liferay osgi liferay-7

使用Liferay 6,使用*LocalServiceUtil静态调用很常见。从Liferay 7开始,应该避免这些调用,以支持@Reference OSGi服务并将其用作类的私有成员,如果我理解正确(随意纠正我)

问题:当我用OSGi友好的等价物替换旧的*LocalServiceUtil调用时,我得到了这个例外:

com.liferay.portal.kernel.security.auth.PrincipalException:
    PermissionChecker not initialized
        at com.liferay.portal.kernel.service.BaseServiceImpl.getPermissionChecker
        at com.liferay.portal.service.impl.UserServiceImpl.getUserById

如何解决?

我可以通过相当于UserLocalServiceUtil.getRoleUsers(RoleLocalServiceUtil.getRole(company.getCompanyId(),"Administrator").getRoleId())的OSGi获得一个随机管理员,并在相当于PermissionThreadLocal.setPermissionChecker(PermissionCheckerFactoryUtil.create(randomAdmin))的OSGi中使用它,但这听起来非常h​​acky,而且它会让我的代码负责#39这个不幸的管理员的肩膀上的行动。

我的代码:

protected void myMethod() {
    userService.getUserById(userId);
}

@Reference(unbind = "-")
protected com.liferay.portal.kernel.service.UserService userService;

1 个答案:

答案 0 :(得分:1)

我认为您实际上想要注入 UserLocalService

在OSGi中,您应该只删除 * Util 后缀以获得相同的功能。

您所做的是从LocalService(UserLocalServiceUtil)移动到远程服务(UserService)。本地服务不检查权限,因此没有权限检查器初始化。

除此之外,您应该确保使用本地服务时不会发生任何恶作剧。建议不要向最终用户公开此类功能,但对某些后台处理来说这很好。