在ModelListener Liferay中引发异常

时间:2018-11-12 20:40:48

标签: liferay hook

Hello Liferay专家,

我有一个需要停止管理员分配角色的要求,我正在尝试使用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");
    }
}

执行此代码时,会引发异常,但UI不能正确处理它,不会显示控制面板的菜单,并且不会向用户显示异常消息。

如何引发异常并在UI中正确处理它并向用户显示错误消息。

谢谢

M

1 个答案:

答案 0 :(得分:1)

安德烈·阿尔伯特(Andre Albert)已经在评论中给了您正确的提示。 您应该保留ModelListener并另外覆盖ActionCommand。

首先,阅读有关Overriding MVC Comands的教程。在实现自定义命令时,请以Liferay's implemenation为基础(不要忘记添加更高的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的catch块中的代码),并且还可以规避其他(编程的)尝试分配角色的尝试。