Андре Альберт уже дал вам правильные подсказки в комментариях.
Вы должны сохранить ModelListener и переопределить ActionCommand дополнительно.
Сначала прочтите учебник о Переопределении команд MVC . При реализации вашей пользовательской команды используйте реализацию Liferay в качестве основы (не забудьте добавить более высокий service.ranking) и замените блок catch на что-то вроде этого:
// I took the freedom and refactored Liferay's catch block a little bit
catch (NoSuchUserException | PrincipalException e) {
SessionErrors.add(actionRequest, e.getClass());
actionResponse.setRenderParameter("mvcPath", "/error.jsp");
} catch (MembershipPolicyException e) {
SessionErrors.add(actionRequest, e.getClass(), e);
actionResponse.setRenderParameter("mvcPath", "/edit_user.jsp");
actionResponse.setRenderParameter("screenNavigationCategoryKey", UserFormConstants.CATEGORY_KEY_GENERAL);
actionResponse.setRenderParameter("screenNavigationEntryKey", UserFormConstants.ENTRY_KEY_ROLES);
} catch (ForbiddenRoleAssociationException e) {
// Here you can add a SessionError
// and set some render parameters
} catch (Exception e) {
throw e;
}
ForbiddenRoleAssociationException
еще не существует. Его цель - отличить этот особый случай ModelListenerException
от других, которые могут вас не заинтересовать. Вам придется реализовать это самостоятельно. Просто расширьте ModelListenerException
:
public class ForbiddenRoleAssociationException extends ModelListenerException {
// here might be some constructors
}
Теперь настройте свой ModelListener так, чтобы он выбрасывал ваш новый ForbiddenRoeAssociationException
:
@Component(immediate = true, service = ModelListener.class)
public class TestUserModelListener extends BaseModelListener<User> {
@Override
public void onBeforeAddAssociation(Object classPK, String associationClassName, Objext accociationClassPK) throws ModelListenerException {
// ...
throw new ForbiddenRoleAssociationException(); // or any other constructor
}
}
Таким образом, вы сможете отображать сообщения об ошибках для администраторов (в зависимости от вашего кода в блоке перехвата ForbiddenRoleAssociationException
) и обходить любые другие (программные) попытки назначения роли.