你好,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
Andre Albert已经在评论中给了您正确的提示。您应该保留ModelListener并另外重写ActionCommand。
首先,阅读有关重写MVC Comands的教程。当实现您的自定义命令时,使用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
的catch块中的代码(,并避免任何其他(编程(分配角色的尝试。