我使用Hook覆盖了JournalArticleServiceImpl的addArticle
和updateArticle
方法。我正在检查具有特定ddmStructureKey的所有文章,并且当前文章在特定字段中具有唯一值。
当我发现非唯一性时,我抛出了DuplicateEntryException异常。在相应的捕获方法中,我给了return null;
。但它扔了NullPointerException
。然后我尝试抛出SystemException,如下所示。
try {
// logic
} catch (DuplicateEntryException e) {
LOG.error("Value already present", e);
throw new SystemException("Value already present", e);
}
但最终用户的结果如下所示。即使在日志中,它显示实际错误,用户也无法从此消息中了解背景中究竟发生了什么。
我不知道如何向最终用户<挂钩显示自定义错误消息。也可以返回同一页面编辑同一篇文章。
答案 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());
的完整示例
答案 1 :(得分:1)
由于UI层似乎不期望这些方法有任何异常,因此这也可能要求更改UI或Action层。当您这样做时,您甚至可以在没有服务更改的情况下顺利进行(因为您可以提前检查)。
一个hacky想法可能是不返回null,而是重复的值 - 模拟成功更新但返回已存在的文章。请注意,这是hacky,我不确定它是否始终有效。如果它坏了,请告诉我它是如何破裂的。