如何使 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 中的错误页面的主要内容,如果未能解决你的问题,请参考以下文章