异常后显示来自 liferay 挂钩服务的自定义错误消息
Display custom error message from a liferay hook service after an exception
我正在使用 Hook 覆盖 JournalArticleServiceImpl 的 addArticle
和 updateArticle
方法。我正在检查所有具有特定 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());
上的完整示例
我正在使用 Hook 覆盖 JournalArticleServiceImpl 的 addArticle
和 updateArticle
方法。我正在检查所有具有特定 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());
上的完整示例