使用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中使用它,但这听起来非常hacky,而且它会让我的代码负责#39这个不幸的管理员的肩膀上的行动。
我的代码:
protected void myMethod() {
userService.getUserById(userId);
}
@Reference(unbind = "-")
protected com.liferay.portal.kernel.service.UserService userService;
答案 0 :(得分:1)
我认为您实际上想要注入 UserLocalService 。
在OSGi中,您应该只删除 * Util 后缀以获得相同的功能。
您所做的是从LocalService(UserLocalServiceUtil)移动到远程服务(UserService)。本地服务不检查权限,因此没有权限检查器初始化。
除此之外,您应该确保使用本地服务时不会发生任何恶作剧。建议不要向最终用户公开此类功能,但对某些后台处理来说这很好。