я собираюсь обработать ResourceRequest, который обслуживает ресурс (динамически сгенерированный PDF).Если при создании этого файла что-то пойдет не так, весь портал с сообщением об ошибке в портлете должен быть обработан.
Можно ли перенаправить ResourceRequest на запрос, который отображает весь портал?Я также рассматриваю возможность перенаправления, но мне хотелось бы иметь возможность передавать некоторые атрибуты / параметры.
Надеюсь, я достаточно ясно объяснил свою проблему.Спасибо.
Related / Duplicate: Как заставить ResourceResponse пересылать запрос на страницу ошибки в портлете liferay
Пример
Это пример работающегои делает что-то похожее на то, чего я хочу достичь.Я использую служебный класс SessionErrors
из Liferay: serveResource()
сохраняет объект в сеансе и выполняет перенаправление на URL рендеринга.Метод doView()
вызывается во время последующего запроса и может читать содержимое, сохраненное в сеансе.
import com.liferay.portal.kernel.servlet.SessionErrors;
import javax.portlet.GenericPortlet;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletException;
import javax.portlet.PortletRequestDispatcher;
public class ResourceRequestForwardPortlet extends GenericPortlet {
public void serveResource(ResourceRequest request, ResourceResponse response)
throws PortletException, IOException {
SessionErrors.add(resourceRequest, "resourcerequest.error", "ERROR " + errorText);
resourceResponse.setProperty(ResourceResponse.HTTP_STATUS_CODE, "302");
resourceResponse.addProperty("Location", resourceResponse.createRenderURL().toString());
}
public void doView(RenderRequest renderRequest, RenderResponse renderResponse)
throws IOException, PortletException {
String error = (String)SessionErrors.get(renderRequest, "resourcerequest.error");
SessionErrors.clear(renderRequest);
renderRequest.setAttribute("errorMsg", error);
PortletRequestDispatcher portletRequestDispatcher = getPortletContext().getRequestDispatcher("view.jsp");
include(viewTemplate, renderRequest, renderResponse);
portletRequestDispatcher.include(renderRequest, renderResponse);
}
}
То, чего я хочу добиться, - то же самое, но не позволяет браузеру выполнять два запроса.Для этого я хотел бы сделать пересылку, и я должен написать сообщение об ошибке в качестве атрибута запроса.
Я загрузил проект с этим примером на GitHub: https://github.com/adrianrm/poc-forward-portlet/tree/master/src/main/java/arm/requestforward