修复 "PrincipalException: PermissionChecker not initialized" Liferay 7 方式
Fixing "PrincipalException: PermissionChecker not initialized" the Liferay 7 way
对于 Liferay 6,使用 *LocalServiceUtil
静态调用很常见。从 Liferay 7 开始,应该避免这些调用,以支持 @Reference
ing 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)。本地服务不检查权限,因此没有权限检查程序初始化。
除上述之外,您应该确保在使用本地服务时不会发生任何恶作剧。不建议将此类功能公开给最终用户,但对于某些后台处理来说没问题。
对于 Liferay 6,使用 *LocalServiceUtil
静态调用很常见。从 Liferay 7 开始,应该避免这些调用,以支持 @Reference
ing 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)。本地服务不检查权限,因此没有权限检查程序初始化。
除上述之外,您应该确保在使用本地服务时不会发生任何恶作剧。不建议将此类功能公开给最终用户,但对于某些后台处理来说没问题。