2017-11-09 7 views
0

Liferay 6에서는 *LocalServiceUtil 정적 호출을 사용하는 것이 일반적이었습니다. Liferay 7에서 시작하여,이 호출은 OSGi 서비스를 @Reference에 사용하는 것을 피하고, 올바르게 이해하면 (나 수정 가능)."PrincipalException : PermissionChecker가 초기화되지 않았습니다."Liferay 7 방식

문제 :

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 

어떻게 그것을 해결하기 위해 : 나는은 OSGi 친화적 동등한 내 오래된 *LocalServiceUtil 전화를 교체 할 때, 나는이 예외가?

나는 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; 

답변

1

나는 당신이 실제로 UserLocalService를 주입하고 싶어 생각합니다.

OSGi에서 동일한 기능을 받으려면 * Util 접미사 만 제거해야합니다.

LocalService (UserLocalServiceUtil)에서 원격 서비스 (UserService)로 이동했습니다. 로컬 서비스는 사용 권한을 확인하지 않으므로 사용 권한 검사기 초기화가 없습니다.

위와 별개로 지역 서비스를 사용할 때 장난이 없어야합니다. 이러한 종류의 기능을 최종 사용자에게 노출하는 것은 좋지 않지만 일부 백그라운드 처리에는 적합합니다.