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

up9lanfz  于 2023-06-04  发布在  Java
关注(0)|答案(4)|浏览(117)

我试图将我的请求转发到错误页面时,在生成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);
            } 
        } }
flvtvl50

flvtvl501#

我不确定,但我的猜测是,你没有设置任何渲染参数时,重定向到您的错误页面。
试试这个,看看它是否有任何帮助(你可以用它来代替dispatcher的行):

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

我正在使用这种类型的重定向与actionResponse,但它应该与resourceResponse以及工作...
EDIT:resource response不包含setRenderParameter方法,但zou可以尝试使用以下方法:
使用response.createRenderURL()创建renderURL。如果使用此URL触发请求,则将导致呈现请求/响应(或可以访问该方法的操作请求)。
问题是,您试图在portlet的资源阶段重定向到另一个页面(在此阶段中未调用呈现阶段)。

gfttwv5a

gfttwv5a2#

我不是100%确定这在resourcePhase中是否有效,但您可以试试

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

yxyvkwin3#

我也遇到过类似的问题。这个管用

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

63lcw9qa4#

也许它没有转发,因为响应已经提交了,因为你已经在里面写了一些东西。这可以解释为什么include可以工作而forward不能。
您可以使用catch块中的resourceResponse.isCommitted()检查响应是否已经提交。

相关问题