3

我正在使用 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向最终用户显示自定义错误消息。也返回同一页面编辑同一篇文章。

4

2 回答 2

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 - portlet , github - hook上的完整示例

于 2016-04-06T13:25:17.840 回答
1

由于 UI 层似乎不希望这些方法有任何异常,因此这可能也需要对 UI 层或 Action 层进行更改。当你这样做时,你甚至可以在不改变服务的情况下相处得很好(因为你可以预先检查)。

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

于 2016-04-06T12:57:37.553 回答