Портлет: Переслать ResourceRequest, чтобы показать весь портал - PullRequest
3 голосов
/ 30 апреля 2011

я собираюсь обработать 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

1 Ответ

0 голосов
/ 14 ноября 2014

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

public class ResourceRequestForwardPortlet extends GenericPortlet {

    public void serveResource(ResourceRequest request, ResourceResponse response)
        throws PortletException, IOException {

        HttpServletRequest request = PortalUtil.getOriginalServletRequest(PortalUtil.getHttpServletRequest(portletRequest));
        PortletURL renderURL = portletResponse.createRenderURL();
        try {
            request.setAttribute("error", errorText);

            String forwardURL = renderURL.toString().replace("http://localhost:8080", "");//The generation of the forwardURL could be done nicer
            RequestDispatcher rd = request.getRequestDispatcher(forwardURL);
            rd.forward(request, PortalUtil.getHttpServletResponse(portletResponse));
        } catch (ServletException e) {
            throw new PortletException(e);
        }
    }
}

Кроме того, когда происходит переадресация, Liferay показывает предупреждение на консоли:

14:33:51,048 WARN  [http-apr-8080-exec-112][code_jsp:128] {code="404", msg="/poc-forward-portlet/web/guest/home", uri=/web/guest/home}
X-Requested-With null
...