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
答案 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块中的代码),并且还可以规避其他(编程的)尝试分配角色的尝试。