修复 "PrincipalException: PermissionChecker not initialized" Liferay 7 方式

Fixing "PrincipalException: PermissionChecker not initialized" the Liferay 7 way

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

问题:当我将旧的 *LocalServiceUtil 调用替换为 OSGi 友好的等效调用时,出现此异常:

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 等价物中使用它,但这听起来很老套,而且它会把我的代码的责任这个倒霉的管理员肩上的行动。

我的代码:

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

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

我想你实际上想注入 UserLocalService.

在 OSGi 中,您应该只去除 *Util 后缀以获得等效的功能。

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

除上述之外,您应该确保在使用本地服务时不会发生任何恶作剧。不建议将此类功能公开给最终用户,但对于某些后台处理来说没问题。