在异常之后显示来自liferay挂钩服务的自定义错误消息

时间:2016-04-06 10:38:23

标签: java liferay liferay-hook

我使用Hook覆盖了JournalArticleServiceImpl的addArticleupdateArticle方法。我正在检查具有特定ddmStructureKey的所有文章,并且当前文章在特定字段中具有唯一值。

当我发现非唯一性时,我抛出了DuplicateEntryException异常。在相应的捕获方法中,我给了return null;。但它扔了NullPointerException。然后我尝试抛出SystemException,如下所示。

try {
// logic
} catch (DuplicateEntryException e) {
    LOG.error("Value already present", e);
    throw new SystemException("Value already present", e);
}

但最终用户的结果如下所示。即使在日志中,它显示实际错误,用户也无法从此消息中了解背景中究竟发生了什么。

enter image description here

我不知道如何向最终用户<挂钩显示自定义错误消息。也可以返回同一页面编辑同一篇文章。

2 个答案:

答案 0 :(得分:2)

在Liferay中显示错误消息:

您可以使用会话消息,例如<liferay-ui:error>代码。

例如在jsp页面中:

<%@ taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui" %>
...
<liferay-ui:error key="err1" message="Third message" translateMessage="false"/>

或异常,例如edit_article.jsp:

<liferay-ui:error exception="<%= ArticleContentSizeException.class %>" message="you-have-exceeded-the-maximum-web-content-size-allowed" />

您可以在Language.properties中定义自己的异常类和自己的消息密钥以及密钥的值。

在渲染方法中:

SessionErrors.add(renderRequest, "err1");

或捕捉异常(e)时使用:

SessionErrors.add(renderRequest, e.getClass());

关于github - portletgithub - hook

的完整示例

答案 1 :(得分:1)

由于UI层似乎不期望这些方法有任何异常,因此这也可能要求更改UI或Action层。当您这样做时,您甚至可以在没有服务更改的情况下顺利进行(因为您可以提前检查)。

一个hacky想法可能是不返回null,而是重复的值 - 模拟成功更新但返回已存在的文章。请注意,这是hacky,我不确定它是否始终有效。如果它坏了,请告诉我它是如何破裂的。