【问题标题】:How to make the ResourceResponse to forward the request to error page in liferay portlet如何使 ResourceResponse 将请求转发到 liferay portlet 中的错误页面
【发布时间】:2023-06-30 23:19:02
【问题描述】:

在生成 Excel 工作表期间发生错误时,我正在尝试将我的请求转发到错误页面。下面是示例代码。我不确定为什么抛出异常时它没有被转发到错误页面,它显示的是空白页面但肯定不会进入我的错误页面。`

        @ResourceMapping("xyz")
    public void generateExcelExport(ResourceRequest request, ResourceResponse response)  {
        try {
            //Do all the excel related logic
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setProperty("Content-Disposition", "attachment; filename=\"" + XYZ + "\"");
            workbook.write(response.getPortletOutputStream());
        } catch (Exception e) {
            response.setProperty("Content-Disposition", "inline" );
            response.setContentType("text/html");
            PortletRequestDispatcher dispatcher = request.getPortletSession().getPortletContext().getRequestDispatcher("/WEB-INF/views/html/jsp/error.jsp");
            try {
                dispatcher.forward(request, response);              
            } catch (Exception e1) {                
                log.error("Unable to forward the request from the portlet", e1);
            } 
        } }

【问题讨论】:

    标签: java model-view-controller portlet liferay-6 forward


    【解决方案1】:

    我不确定,但我猜你在重定向到错误页面时没有设置任何渲染参数。

    试试这个,看看它是否有任何帮助(你可以把它放在调度员的线上):

    response.setRenderParameter("jspPage", "/WEB-INF/views/html/jsp/error.jsp");
    

    我将这种重定向与 actionResponse 一起使用,但它也应该与 resourceResponse 一起使用...

    编辑:资源响应不包含 setRenderParameter 方法,但邹可以尝试使用以下方法:

    使用response.createRenderURL() 创建renderURL。如果使用此 URL 触发请求,它将导致呈现请求/响应(或可以访问该方法的操作请求)。

    问题是,您试图在 portlet 的资源阶段重定向到另一个页面(在此阶段不调用渲染阶段)。

    【讨论】:

    • 我认为“ResourceResponse”接口下不存在“setRenderParameter”方法。是的,它存在于您在案例中使用的“ActionResponse”中
    • 我编辑了我的答案,也许它有助于弄清楚该怎么做。我认为调用渲染请求并在处理此方法后进入渲染阶段会使其工作......
    • 感谢您的帮助 Smajil 和幸运男孩。我通过在dispatcher.forward(request, response); 之前添加dispatcher.include(request, response); 使其工作。虽然我没有得到与 portlet 相同的外观和感觉,但我现在至少可以显示一些用户友好的错误消息。
    • 你应该发布你的答案并将其标记为已回答 :-) 很高兴你让它正常工作!
    • 我尝试为我遇到的同样问题重新创建您的步骤,但我得到 org.apache.jasper.JasperException: javax.servlet.jsp.JspException: null 任何想法?
    【解决方案2】:

    我不能 100% 确定这在资源阶段是否有效,但您可以尝试

    com.liferay.portal.kernel.servlet.SessionErrors.add(request, "your Error message here");
    

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题。这行得通 -

      PortletURL renderUrl = resourceResponse.createRenderURL();  
      renderUrl.setParameter("renderException", ex.toString());   
      resourceResponse.addProperty("Location", renderUrl.toString());
      

      【讨论】:

      • 但这可能会进行重定向,而不是转发。
      【解决方案4】:

      也许它没有转发,因为响应已经提交,因为你在里面写了一些东西。这可以解释为什么 include 有效而 forward 无效。

      您可以在 catch 块中使用 resourceResponse.isCommitted() 检查响应是否已提交。

      【讨论】:

        最近更新 更多