Брось исключение в ModelListener Liferay - PullRequest
0 голосов
/ 12 ноября 2018

Hello Liferay Experts,

У меня есть требование, когда мне нужно помешать администратору назначить роль, я пытаюсь реализовать это с помощью ModelListener.

Вот код ..

@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 ModelListenerException("User creation not allowed");
    }
}

Когда этот код выполняется, генерируется исключение, но пользовательский интерфейс не обрабатывает его правильно, меню панели управления не отображаются и сообщение об исключении не отображается для пользователя.

Как вызвать исключение и правильно его обработать в пользовательском интерфейсе и отобразить сообщение об ошибке для пользователя.

Спасибо

M

1 Ответ

0 голосов
/ 18 ноября 2018

Андре Альберт уже дал вам правильные подсказки в комментариях. Вы должны сохранить 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) и обходить любые другие (программные) попытки назначения роли.

...