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

Display custom error message from a liferay hook service after an exception

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

当我发现非唯一性时,我将抛出 DuplicateEntryException 异常。在相应的 catch 方法中,我给出了 return null;。但是它抛出了一个NullPointerException。然后我尝试像下面这样抛出 SystemException。

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

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

我不知道如何通过 Hook 向最终用户显示自定义错误消息。还要return到同一页面编辑同一篇文章

由于 UI 层似乎不期望这些方法有任何异常,这可能也需要更改 UI- 或动作层。当你这样做时,你甚至可以在没有服务变化的情况下相处得很好(因为你可以提前检查)。

一个 hacky 想法可能不是 return null,而是重复值 - 模拟成功更新但 return 已经存在的文章。请注意,这是 hacky,我不确定它是否总是有效。如果它坏了,请告诉我它是怎么坏的。

在 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" />

您可以定义自己的异常 class 和您自己的消息键以及 Language.properties 中键的值。

并且在渲染方法中:

SessionErrors.add(renderRequest, "err1");

或者在捕获异常时 (e) 使用这个:

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

github - portlet, github - hook

上的完整示例