如何使 ResourceResponse 将请求转发到 liferay portlet 中的错误页面

Posted

技术标签:

【中文标题】如何使 ResourceResponse 将请求转发到 liferay portlet 中的错误页面【英文标题】:How to make the ResourceResponse to forward the request to error page in liferay portlet 【发布时间】:2013-07-26 02:07:12 【问题描述】:

在生成 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);
             
         

【问题讨论】:

【参考方案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() 检查响应是否已提交。

【讨论】:

以上是关于如何使 ResourceResponse 将请求转发到 liferay portlet 中的错误页面的主要内容,如果未能解决你的问题,请参考以下文章

如何使http请求强制跳转到https

如何使 AWS ALB 将请求源发送到 lambda

CAS服务器认证成功后,如何使Spring安全将用户重定向到原始请求的页面

如何使用 Html Agility Pack 使请求超时

如何使jquery“$ .post”请求同步[重复]

如何使surface.DrawTexturedRectRotated() 从左旋转?