Отображать пользовательское сообщение об ошибке из службы ловушки Liferay после исключения

Я переопределяю addArticle а также updateArticle методы JournalArticleServiceImpl с использованием хука. Я проверяю все статьи с определенным ddmStructureKey и что текущая статья имеет уникальное значение в определенном поле.

Я выбрасываю исключение DuplicateEntryException, когда нахожу неуникальность. В рамках соответствующего метода вылова я дал return null;, Но это бросило NullPointerException, Затем я попытался бросить SystemException следующим образом.

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

Но результат для конечных пользователей был таким, как показано ниже. Несмотря на то, что в журналах отображалась фактическая ошибка, пользователи не могут понять, что именно произошло в фоновом режиме из этого сообщения.

Я не знаю, как отобразить пользовательское сообщение об ошибке для конечных пользователей из хука. Также, чтобы вернуться на ту же страницу, чтобы редактировать ту же статью.

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 - портлет, github - hook

Поскольку уровень пользовательского интерфейса, по-видимому, не ожидает каких-либо исключений от этих методов, это может также потребовать изменений в пользовательском интерфейсе или уровне действий. Когда вы это сделаете, вы можете даже обойтись без изменений в обслуживании (потому что вы можете проверить заранее).

Хакерская идея может заключаться в том, чтобы не возвращать нулевое значение, а дублированное значение - имитировать успешное обновление, но возвращать уже существующую статью. Обратите внимание, что это хаки, я не уверен, работает ли это всегда. Если он сломается, пожалуйста, дайте мне знать, как он сломается.

Другие вопросы по тегам